mysql如果语句怎么做

时间:2012-02-01 02:26:03

标签: php mysql polymorphic-associations

我如何在mysql中编码?

如果tbl_comments.to是一个数字,则加入tbl_users

如果tbl_comments.to是一个玩家密钥,则加入桌面人员并显示名称

如果tbl_comments.to是团队密钥,则加入表团队并显示名称

如果tbl_comments.to是联盟密钥,则加入tbl_sports

2 个答案:

答案 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