首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复杂的sql查询问题

复杂的sql查询问题
EN

Stack Overflow用户
提问于 2011-08-26 06:10:07
回答 2查看 66关注 0票数 0

我有一个小的SQL,但是我找不到返回文本的方法,只找到了数字。-修订!

代码语言:javascript
复制
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

代码语言:javascript
复制
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:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-26 06:47:34

在连接上看起来确实有点多余,因为您暗示ID和Link_ID列是相同的值。因为这两个select值都是从group members表的限定中派生出来的,所以我重构了查询,将其用作主表,并与其他每个表进行左连接,因为从您的查询中可以看出,应该从一个或另一个表中找到链接。因此,对于每个左连接,您只需遍历GroupMembers表一次。现在,您的IF()。因为组成员是基础,并且我们有两个可用的表和链接的表,所以我们只从一个表与另一个表中分别获取列。我也包含了"linktype“,只是为了参考。通过使用STRAIGHT_JOIN,将帮助引擎不再试图改变对如何连接表的解释。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2011-08-26 06:20:46

如果contactgroups.id必须等于groupmembers.id,但也必须等于2,这是多余的,也可能是您的问题所在。正如您所写的,它工作得很好:http://ideone.com/7EGLZ,所以如果不知道它的实际用途,我就无能为力了。

编辑:我不熟悉逗号分隔的FROM,但是它给出的结果是相同的,因为您不需要从其他表中选择任何内容,所以这并不重要。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7197836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档