2015-06-11 2 views
0

У меня есть три таблицы - p, m и i. M является связующей таблицей для p и i и имеет атрибут расстояния, чтобы определить, как далеко находится от p. Я хочу сделать все i для каждого p, если он еще не был выбран для предыдущего p. Поскольку вы не можете вызывать select, отличный от одного столбца, я немного смущен относительно того, что я могу сделать. Сейчас мой запрос выглядит следующим образом (надеюсь, все еще легко следовать, как я пытаюсь сделать это немного расплывчатым):Выбор из присоединенной таблицы соединений, только если он еще не был выбран

select p.id, p.name, m.distance, i.id from p join m on p.id=m.p_id join i on m.i_id=i.id where m.distance <= 30 order by p.name; 

В принципе, я только хочу, я связан с р, если это не ближе к другому р (что бы определяется m.distance). Есть много предметов, которые больше 30, я не хочу их вообще.

Буду отбивать мне голову против этого в течение часа. Я был бы очень признателен за понимание.

ответ

1

Вы можете использовать группу по i.id, чтобы иметь различные значения этого столбца в результате.

Но сначала, чтобы убедиться, что вы получаете я с наименьшим расстоянием до р, я рекомендовал бы сначала сделать выбор и заказ на расстояние, как это:

select p.id, p.name, m.distance, i.id 
from p join m on p.id=m.p_id join i on m.i_id=i.id 
where m.distance <= 30 order by m.distance asc 

Этот предыдущий запрос будет возвращать все Они связаны с р, упорядоченными по расстоянию от наименьшего до наибольшего.

Затем вы можете сделать выбор по результату, возвращенному предыдущим запросом и группой, по i.id. Группа будет действовать как отдельный столбец i.id, который вернет первую найденную строку (наименьшую), если ее несколько. I.id:

select * from (select p.id, p.name as p_name, m.distance, i.id as idOfI 
from p join m on p.id=m.p_id join i on m.i_id=i.id 
where m.distance <= 30 order by m.distance asc) as ordredIs 
group by idOfI 
order by p_name 
+0

Спасибо. Я просто понял это и пришел сюда, чтобы проверить, насколько я прав, и получил тот же ответ. Я также выбираю min (distance) как расстояние по моему внешнему запросу, чтобы гарантировать, что mysql выбирает ближайший i, когда их несколько. Из того, что я читаю, он иногда может выбирать один случайным образом, когда вы используете группу, и я хотел убедиться, что это не так. Возможно, я ошибаюсь, и это пустая трата SQL, но она все-таки решила мою проблему. Благодарю за ваш ответ. – Skyline969

Смежные вопросы