Вы должны использовать дополнительный подзапрос, чтобы выяснить, что минимальный радиус в механике (где радиус больше, чем расстояние), а затем вы можете присоединиться к этой обратно на два столы и получить всю информацию столбца вам нужно от двух таблиц:
SELECT m.ID, mz.Zone, m.distance, mz.radius
FROM Mechanics m
INNER JOIN mechanic_zones mz
ON mz.Mechanic_ID = m.ID
INNER JOIN
( SELECT m.ID,
MIN(mz.radius) AS radius
FROM Mechanics m
INNER JOIN mechanic_zones mz
ON mz.Mechanic_ID = m.ID
WHERE mz.radius > M.distance
GROUP BY m.ID
) MinZone
ON MinZone.ID = m.ID
AND MinZone.radius= mz.radius
ORDER BY mz.Zone;
Example on SQL Fiddle
Если вы на самом деле не хотят знать radiu s выбранной зоны и зоны с наименьшим радиусом всегда будет иметь самое низкое письмо, которое вы можете просто использовать:
SELECT m.ID, mz.MinZone, m.distance
FROM Mechanics m
INNER JOIN
( SELECT m.ID,
MIN(mz.Zone) AS Zone
FROM Mechanics m
INNER JOIN mechanic_zones mz
ON mz.Mechanic_ID = m.ID
WHERE mz.radius > M.distance
GROUP BY m.ID
) MinZone
ON MinZone.ID = m.ID
ORDER BY MinZone.Zone;
Example on SQL Fiddle
EDIT
Ваша скрипка очень близко к тому, что я буду использовать, но я бы использовал следующее, чтобы расчет проводился только один раз:
SELECT m.id, m.name, m.distance, m.radius, m.zone
FROM ( SELECT m.ID,
m.Name,
m.Distance,
MIN(mz.radius) AS radius
FROM ( SELECT ID, Name, (1 * Distance) AS Distance
FROM Mechanics
) m
INNER JOIN mechanic_zones mz
ON mz.Mechanic_ID = m.ID
WHERE mz.radius > M.distance
GROUP BY m.ID, m.Name, m.Distance
) m
INNER JOIN mechanic_zones mz
ON mz.Mechanic_ID = m.ID
AND mz.radius = m.radius;
Example on SQL Fiddle
Причина в том, что ваш запрос имеет столбцы в списке выбора, а не в группе по, так что нет никакой гарантии, что радиус возвращается будет самая низкая. Например, если изменить порядок, в котором записи будут вставлены в mechanic_zones (as in this fiddle) вы результаты становятся:
ID NAME DTJ RADIUS ZONE
1 Jon 2 10 a
2 Paul 11 50 b
3 George 5 5 a
Вместо
ID NAME DTJ RADIUS ZONE
1 Jon 2 5 a
2 Paul 11 20 b
3 George 5 5 a
Как вы можете увидеть радиус для Джона является неправильным. Объяснить это ниже - выдержка из объяснения, которое я написал о коротких моментах приведения MySQL в неявную группировку.
Я бы посоветовал, чтобы избежать неявной группировки, предлагаемый MySQL, где это возможно, при этом я имею в виду в том числе столбцов в списке выбора, даже если они не содержится в агрегатной функции или группы по п.
Представьте себе следующую простую таблицу (T):
ID | Column1 | Column2 |
----|---------+----------|
1 | A | X |
2 | A | Y |
В MySQL вы можете написать
SELECT ID, Column1, Column2
FROM T
GROUP BY Column1;
Это фактически разрушает SQL Standard, но он работает в MySQL, однако проблема в том, что не недетерминированно, результат:
ID | Column1 | Column2 |
----|---------+----------|
1 | A | X |
не является более или менее правильно, чем
ID | Column1 | Column2 |
----|---------+----------|
2 | A | Y |
Так что вы говорите, дайте мне одну строку для каждого отдельного значения Column1
, что оба результата множества удовлетворяют, так как вы знаете, какой из них вы получите? Ну вы этого не сделаете, это, кажется, довольно распространенное заблуждение, что вы можете добавлять и ORDER BY
положение, чтобы повлиять на результаты, так, например, следующий запрос:
SELECT ID, Column1, Column2
FROM T
GROUP BY Column1
ORDER BY ID DESC;
гарантировало бы, что вы получите следующий результат:
ID | Column1 | Column2 |
----|---------+----------|
2 | A | Y |
из-за ORDER BY ID DESC
, однако это не так (as demonstrated here).
MMySQL documents состояния:
Сервер может свободно выбрать любое значение из каждой группы, так что, если они не совпадают, значение, выбранное неопределенно. Более того, выбор значений из каждой группы не может зависеть от добавления предложения ORDER BY.
Таким образом, даже если у вас есть такой порядок, это не применяется до тех пор, пока не будет выбрана одна строка для каждой группы, и эта одна строка не определена.
SQL-стандарт разрешает столбцы в списке выбора, не содержащиеся в GROUP BY или агрегатной функции, однако эти столбцы должны быть функционально зависимыми от столбца в GROUP BY. Например, идентификатор в таблице образцов является PRIMARY KEY, поэтому мы знаем, что он уникален в таблице, поэтому следующий запрос соответствует стандарту SQL и будет работать в MySQL и не работать во многих СУБД в настоящее время (во время написания Postgresql является ближайшим СУБД я знаю правильно реализации стандарта):
SELECT ID, Column1, Column2
FROM T
GROUP BY ID;
Поскольку идентификатор уникален для каждой строки, может быть только одно значение Column1
для каждого идентификатора, одно значение Column2
не существует никакой двусмысленности что возвращать для каждой строки.
Спасибо, Гарет. Я думаю, что ошибался в том, что расчет расстояния не имеет значения (он действительно работает на расстоянии, используя почтовый индекс механики), но поскольку он рассчитан, я не могу тогда ссылаться на него в результате: я думаю, это иллюстрирует это: http://sqlfiddle.com/#!2/e4b60/11, еще раз спасибо за ваш ответ – jx12345
Я обновил вопрос, чтобы уточнить – jx12345
В какой момент рассчитано расстояние? – GarethD