您好我有以下查询,我想知道这意味着什么:
SELECT c1.id as sender, c2.id as replier
FROM contacts c1, contacts c2;
如何两次使用同一张表?
答案 0 :(得分:14)
在查询中使用一个表两次,给它两个名称,就像那样。
通常使用关键字AS引入别名。您通常也会指定一个连接条件(如果没有它,则会得到与自身连接的表的Cartesian Product)。您首选使用显式JOIN表示法。
SELECT c1.id AS sender, c2.id AS replier
FROM contacts AS c1
JOIN contacts AS c2 ON c1.xxx = c2.yyy;
在此示例中,不清楚哪些列可能用于连接;我们没有任何信息可以帮助解决这个问题。
通常情况下,还有另一个表作为中介,例如消息表:
SELECT c1.id AS sender, c1.email AS sender_email,
c2.id AS replier, c2.email AS replier_email,
m.date_time
FROM messages AS m
JOIN contacts AS c1 ON m.sender_id = c1.id
JOIN contacts AS c2 ON m.replier_id = c2.id;
答案 1 :(得分:8)
此查询创建一个包含所有可能的联系人ID对的表。
例如,如果您的联系ID为1,2和3,则会得到
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3
答案 2 :(得分:2)
这是一个简单的答案:使用示例中列出的查询。它应该工作得很好。虽然这可能是一个坏主意,但如果你想两次使用同一个表,请注意你必须加入“那些”表,因为它们是不同的:
SELECT c1.id as sender, c2.id as replier
FROM contacts c1, contacts c2
WHERE sender.id = replier.id
答案 3 :(得分:1)
是的,您可以通过为表提供不同的别名来使用同一个表两次。我认为学习自我联合会帮助你理解。
答案 4 :(得分:1)
是的,您可以在同一SELECT
查询中多次使用同一个表。
请注意,当表格在同一范围内出现多次时,您只需要使用表格相关名称(俗称“别名”)。例如,以下SELECT
查询使用相同的表两次,但由于每个查询都位于不同的范围内(每个范围由UNION
关键字分隔),因此不需要表关联名称:
SELECT id, 'Sender' AS contact_narrative
FROM contacts
WHERE something = 1
UNION
SELECT id, 'Replier' AS contact_narrative
FROM contacts
WHERE something = 2;