复杂的SQL查询问题

时间:2011-08-25 22:10:07

标签: mysql sql

我有一点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)表明我的问题。我看不出我该怎么办...欢迎任何建议! Thansk

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'中,如果我是对的,结果应该是Andrew和受托人:)

2 个答案:

答案 0 :(得分:1)

如果contactgroups.id必须等于groupmembers.id但必须等于2,那么这也是多余的,也可能是您的问题所在。它写得很好:http://ideone.com/7EGLZ所以不知道实际应该做什么,我无能为力。

编辑:我不熟悉以逗号分隔的FROM,但它会给出相同的结果,因为您没有从其他表中选择任何内容,因此它并不真正物质

答案 1 :(得分:1)

在连接上看起来确实有点多余,因为您暗示ID和Link_ID列都是相同的值。由于BOTH选择值是从对组成员表的限定中派生的,因此我重新构建了查询以使用THAT作为主表,并对每个其他表执行LEFT JOIN,从您的查询中预期应该从中查找链接一个或其他表。因此,对于每个LEFT JOIN,您将仅通过GroupMembers表进行ONCE。现在,你的IF()。由于组成员是基础,并且我们有可用和链接的BOTH表,我们只是分别从一个表到另一个表中获取列。我已经包含了“linktype”,仅供参考。通过使用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