我有一个小的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和the:)
发布于 2011-08-26 06:47:34
在连接上看起来确实有点多余,因为您暗示ID和Link_ID列是相同的值。因为这两个select值都是从group members表的限定中派生出来的,所以我重构了查询,将其用作主表,并与其他每个表进行左连接,因为从您的查询中可以看出,应该从一个或另一个表中找到链接。因此,对于每个左连接,您只需遍历GroupMembers表一次。现在,您的IF()。因为组成员是基础,并且我们有两个可用的表和链接的表,所以我们只从一个表与另一个表中分别获取列。我也包含了"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发布于 2011-08-26 06:20:46
如果contactgroups.id必须等于groupmembers.id,但也必须等于2,这是多余的,也可能是您的问题所在。正如您所写的,它工作得很好:http://ideone.com/7EGLZ,所以如果不知道它的实际用途,我就无能为力了。
编辑:我不熟悉逗号分隔的FROM,但是它给出的结果是相同的,因为您不需要从其他表中选择任何内容,所以这并不重要。
https://stackoverflow.com/questions/7197836
复制相似问题