Как получить имена как chooser, так и selected в одном отчете с помощью SQL SELECT? - PullRequest
1 голос
/ 16 марта 2012

Я хочу составить список учеников, выбирающих других учеников для соседей по комнате. Таким образом, они могут быть разделены на выбирающих и выбранных. Другими словами, это вопрос о том, как объединить две таблицы с отношением «многие ко многим», когда на одну таблицу ссылаются дважды.

Для начала я составил таблицу всех учеников, которых творчески называют "Ученики" ...

Затем я составил таблицу с двумя наборами внешних ключей, ссылающихся на идентификаторы из списка ученика, чтобы обозначить «выбрал» и «выбрал». Я назвал это «Выбор» и связал многих со многими.

Я получаю две таблицы:

  • Ученики: Поля: id, имя, фамилия, возраст, пол, класс
  • Выбор: поля: id, chooser_fk, choice_fk, choice_priority

Однако я потерпел неудачу, когда попытался сообщить имена как chooser, так и выбранного с помощью SELECT.

Кажется, я не могу продвинуться дальше:

SELECT Pupils.firstname, Pupils.lastname, Choices.choice
FROM Pupils
INNER JOIN Choices
ON Pupils.id=Choices.chooser
WHERE Pupils.sex = 'M';

... но он получает только имя для выбора и только идентификатор выбранного. Я пытался искать, но вещи, которые я нашел, были неуместны или слишком сложны, чтобы я мог их правильно понять. Все еще пытаюсь учиться.

Я бы хотел, чтобы в отчете были имена как для выбора, так и для выбранного рядом. Как мне это сделать?

Ответы [ 3 ]

2 голосов
/ 16 марта 2012

Вам нужна одна ссылка Pupils для выбора и другая ссылка Pupils для выбора / выбрано:

SELECT 
    p1.firstname, p1.lastname, --chooser
    p2.firstname, p2.lastname  --choice/chosen
FROM Pupils p1
INNER JOIN Choices
    ON p1.id=Choices.chooser
INNER JOIN Pupils p2
    ON p2.id=Choices.choice
WHERE p1.sex = 'M'; --or whatever clause makes sense to you
                    --the important concept here is referencing Pupils twice
1 голос
/ 16 марта 2012

В JOIN, если вам нужны две отдельные строки (в данном случае ученики) из одной и той же таблицы, вам нужно присоединиться к ней дважды в запросе, один раз для выбора и один раз для выбранного. Это будет выглядеть примерно так:

SELECT p1.firstname ChooserFN, p1.lastname ChooserLN, 
       p2.firstname ChosenFN,  p2.lastname ChosenLN
FROM Pupils p1
JOIN Choices c ON p1.id = c.chooser
JOIN Pupils p2 ON p2.id = c.chosen
WHERE p1.sex = 'M' OR p2.sex = 'M';
1 голос
/ 16 марта 2012

Просто снова присоединитесь к столу для выбора:

SELECT chooser.firstname AS ChooserFirst, chooser.lastname AS ChooserLast, 
       chosen.firstname AS ChosenFirst, chosen.lastname AS ChosenLast, 
FROM Choices AS c
JOIN Pupils AS chooser
  ON chooser.id=c.chooser
JOIN Pupils AS chosen
  on chosen.id=c.chosen
WHERE (chooser.sex = 'M' or chosen.sex ='M');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...