我有一点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

10-05 18:09
查看更多