我如何在mysql中编码?
如果tbl_comments.to是一个数字,则加入tbl_users
如果tbl_comments.to是一个玩家密钥,则加入桌面人员并显示名称
如果tbl_comments.to是团队密钥,则加入表团队并显示名称
如果tbl_comments.to是联盟密钥,则加入tbl_sports
答案 0 :(得分:1)
使用引用几个可能表之一的列的做法称为多态关联。这是一个破坏关系数据库设计规则的黑客。
SQL不支持对不同表的条件连接,具体取决于您在给定行中找到的值。在数据库分析查询时,必须知道所有表。
您可以使用外连接加入所有这些表,因为这些表中只有一个应包含匹配项:
SELECT c.*, COALESCE(u.name, p.name, t.name, s.name) AS name
FROM tbl_comments AS c
LEFT OUTER JOIN tbl_users u ON c.to = u.id AND c.type = 'number'
LEFT OUTER JOIN tbl_persons p ON c.to = p.id AND c.type = 'player'
LEFT OUTER JOIN tbl_teams t ON c.to = t.id AND c.type = 'team'
LEFT OUTER JOIN tbl_sports s ON c.to = s.id AND c.type = 'league';
或者你可以加入其中一个表但限制你知道匹配的行:
SELECT c.*, u.name
FROM tbl_comments AS c
INNER JOIN tbl_users u ON c.to = u.id
WHERE c.type = 'number'
UNION ALL
SELECT c.*, p.name
FROM tbl_comments AS c
INNER JOIN tbl_persons u ON c.to = p.id
WHERE c.type = 'player'
UNION ALL
SELECT c.*, t.name
FROM tbl_comments AS c
INNER JOIN tbl_teams t ON c.to = t.id
WHERE c.type = 'team'
UNION ALL
SELECT c.*, s.name
FROM tbl_comments AS c
INNER JOIN tbl_sports s ON c.to = s.id
WHERE c.type = 'league'
答案 1 :(得分:0)
你怎么知道tbl_comments.to
是什么,你有另一栏保存类型吗?
或者您需要加入所有表格。
SELECT * FROM tbl_comments c
LEFT JION ON tbl_users u ON c.to = u.id
LEFT JION ON tbl_persons p ON c.to = p.id
LEFT JION ON tbl_teams t ON c.to = t.id
LEFT JION ON tbl_sports s ON c.to = s.id