我有一点SQL,但是找不到找回数字的方法。 -修改!
SELECT if( `linktype` = "group",
(SELECT contactgroups.grname
FROM contactgroups, groupmembers
WHERE contactgroups.id = groupmembers.id ???
AND contactgroups.id = groupmembers.link_id),
(SELECT contactmain.contact_sur
FROM contactmain, groupmembers
WHERE contactmain.id = groupmembers.id ???
AND contactmain.id = groupmembers.link_id) ) AS adat
FROM groupmembers;
到现在为止,我已经改进了一些信息,但是??? (感谢minitech)指出了我的问题。我看不到该如何解决...欢迎任何建议!坦斯克
Contactmain (id, contact_sur, email2)
data:
1 | Peter | email@email.com
2 | Andrew| email2@email.com
Contactgroups (id, grname)
data:
1 | All
2 | Trustee
3 | Comitee
Groupmembers (id, group_id, linktype, link_id)
data:
1 | 1 | contact | 1
2 | 1 | contact | 2
3 | 2 | contact | 1
4 | 3 | group | 2
我想列出谁在“ Comitee”中,如果我是对的,结果应该是安德鲁和受托人:)
最佳答案
在连接上看起来确实有些多余,因为您暗示ID和Link_ID列的值相同。由于这两个选择值均来自于对组成员表的限定,因此我将查询重构为使用THAT作为主表,并对所有其他表进行了LEFT JOIN,从您的查询中预计应该从中找到链接一个或其他表。因此,对于每个各自的LEFT JOIN,您将仅一次浏览GroupMembers表。现在,您的IF()。由于组成员是基础,并且我们有可用的表和已链接的表,因此我们仅从一个表与另一个表中分别获取列。我也包括“链接类型”,仅供参考。通过使用STRAIGHT_JOIN,将有助于引擎尝试更改对如何联接表的解释。
SELECT STRAIGHT_JOIN
gm.linktype,
if( gm.linktype = "group", cg.grname, cm.contact_sur ) ADat
from
groupmembers gm
left join contactgroups cg
ON gm.link_id = cg.id
left join contactmain cm
ON gm.link_id = cm.id