Mysql 如何使用SQL SELECT在单个报告中获取选择器和所选对象的名称?

Mysql 如何使用SQL SELECT在单个报告中获取选择器和所选对象的名称?,mysql,sql,many-to-many,Mysql,Sql,Many To Many,我想列一张学生选择其他学生作为室友的名单。因此,它们可以分为选择器和选择器。换句话说,这是一个关于当一个表被引用两次时,如何连接具有多对多关系的两个表的问题 首先,我把所有的学生都做了一张桌子,创造性地称之为“学生” 然后我制作了一个表,其中包含两组外键,它们引用学生列表的ID来表示chooser和Selected。我称之为“选择”,并建立了多对多的关系 我最后有两张桌子: 学生:字段:id、名、姓、年龄、性别、班级 选项:字段:id、选择器、选项、选项优先级 然而,当我试图用SELECT报告选

我想列一张学生选择其他学生作为室友的名单。因此,它们可以分为选择器和选择器。换句话说,这是一个关于当一个表被引用两次时,如何连接具有多对多关系的两个表的问题

首先,我把所有的学生都做了一张桌子,创造性地称之为“学生”

然后我制作了一个表,其中包含两组外键,它们引用学生列表的ID来表示chooser和Selected。我称之为“选择”,并建立了多对多的关系

我最后有两张桌子:

学生:字段:id、名、姓、年龄、性别、班级 选项:字段:id、选择器、选项、选项优先级 然而,当我试图用SELECT报告选择器和SELECT的名称时,我遇到了问题

除此之外,我似乎再也没有别的办法了:

SELECT Pupils.firstname, Pupils.lastname, Choices.choice
FROM Pupils
INNER JOIN Choices
ON Pupils.id=Choices.chooser
WHERE Pupils.sex = 'M';
…但这仅获取选择器的名称,以及所选对象的ID。我试着搜索,但我发现的东西要么无关紧要,要么太高级,我无法正确理解。还在努力学习

我想在报告中同时列出选择器和Selected的名称。如何做到这一点?

您需要一份学生参考资料供选择者参考,另一份学生参考资料供选择者参考:

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
您需要一份学生参考资料供选择者参考,另一份学生参考资料供选择/选择:

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

只需为选择器再次加入表:

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');

只需为选择器再次加入表:

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');
在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';
在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';

谢谢,这很有效我今天学到了一些新东西。在哪里可以找到像这样容易解释的东西呢?这里,我想:-很高兴帮助你,谢谢你,这个有用!:我今天学到了一些新东西。在哪里可以找到像这样容易解释的东西呢?我想在这里:-很乐意帮忙