【问题标题】:Combine multiple sql / mysql queries in one query将多个 sql / mysql 查询合并到一个查询中
【发布时间】:2015-02-02 09:30:23
【问题描述】:

我有 5 张桌子。即userreference_1reference_2reference_3question

user => (user_id,user_name,user_emailid,user_mobno)
reference_1 => (ref_id_1,user_id,ref_name,ref_email,ref_mobno)
reference_2 => (ref_id_2,user_id,ref_name,ref_email,ref_mobno)
reference_3 => (ref_id_3,user_id,ref_name,ref_email,ref_mobno)
question => (que_id,user_id,ref_id_1,ref_id_2,ref_id_3,que1_name,que2_name,que3_name,que4_name,que5_name,que6a_name,que6b_name,que7_name,qa1,qa2,qa3,qa4,qa5,qa6a,qa6b,qa7,flag)

我连续发出 4 个查询:

查询 1:使用 LEFT JOIN 从 user 表和 question 获取数据

select u.user_name,u.user_emailid,u.user_mobno,
  q.que1_name,q.qa1,q.que2_name,q.qa2,q.que3_name,q.qa3,q.que4_name,q.qa4,q.que5_name,q.qa5,q.que6a_name,q.qa6a,q.que6b_name,q.qa6b,q.que7_name,q.qa7
from user u
LEFT JOIN question q
on u.user_id = q.user_id
WHERE q.flag = 1

查询 2:使用 LEFT JOIN 从 user 表和 reference_1 获取数据

select r1.ref_name,r1.ref_email,r1.ref_mobno,
  q.que1_name,q.qa1,q.que2_name,q.qa2,q.que3_name,q.qa3,q.que4_name,q.qa4,q.que5_name,q.qa5,q.que6a_name,q.qa6a,q.que6b_name,q.qa6b,q.que7_name,q.qa7
from reference_1 r1
left join question q
on r1.ref_id_1 = q.ref_id_1

查询 3:使用 LEFT JOIN 从 user 表和 reference_2 获取数据

select r2.ref_name,r2.ref_email,r2.ref_mobno,  
  q.que1_name,q.qa1,q.que2_name,q.qa2,q.que3_name,q.qa3,q.que4_name,q.qa4,q.que5_name,q.qa5,q.que6a_nam e,q.qa6a,q.que6b_name,q.qa6b,q.que7_name,q.qa7
from reference_2 r2
left join question q
on r2.ref_id_2 = q.ref_id_2

查询 4:使用 LEFT JOIN 从 user 表和 reference_3 获取数据

select r3.ref_name,r3.ref_email,r3.ref_mobno,  
  q.que1_name,q.qa1,q.que2_name,q.qa2,q.que3_name,q.qa3,q.que4_name,q.qa4,q.que5_name,q.qa5,q.que6a_name,q.qa6a,q.que6b_name,q.qa6b,q.que7_name,q.qa7
from reference_3 r3
left join question q
on r3.ref_id_3 = q.ref_id_3

现在需要将所有 4 个查询合并为一个以显示数据。

我尝试在一个查询中加入所有这些查询

select u.user_name,u.user_emailid,u.user_mobno,

q.que1_name,q.qa1,q.que2_name,q.qa2,q.que3_name,q.qa3,q.que4_name,q.qa4,q.que5_name,q.qa5,q.que6a_name,q.qa6a,q.que6b_name,q.qa6b,q.que7_name,q.qa7,

r1.ref_name,r1.ref_email,r1.ref_mobno,  q.que1_name,q.qa1,q.que2_name,q.qa2,q.que3_name,q.qa3,q.que4_name,q.qa4,q.que5_name,q.qa5,q.que6a_name,q.qa6a,q.que6b_name,q.qa6b,q.que7_name,q.qa7,

r2.ref_name,r2.ref_email,r2.ref_mobno,  q.que1_name,q.qa1,q.que2_name,q.qa2,q.que3_name,q.qa3,q.que4_name,q.qa4,q.que5_name,q.qa5,q.que6a_name,q.qa6a,q.que6b_name,q.qa6b,q.que7_name,q.qa7,

r3.ref_name,r3.ref_email,r3.ref_mobno, q.que1_name,q.qa1,q.que2_name,q.qa2,q.que3_name,q.qa3,q.que4_name,q.qa4,q.que5_name,q.qa5,q.que6a_name,q.qa6a,q.que6b_name,q.qa6b,q.que7_name,q.qa7

from user u
LEFT JOIN question q
on u.user_id = q.user_id
WHERE q.flag = 1
LEFT JOIN reference_1 r1
LEFT JOIN question q1
on r1.ref_id_1 = q1.ref_id_1
LEFT JOIN reference_2 r2
LEFT JOIN question q2
on r2.ref_id_2 = q2.ref_id_2
LEFT JOIN reference_3 r3
LEFT JOIN question q3
on r3.ref_id_3 = q3.ref_id_3

但是这个查询不起作用。

【问题讨论】:

  • 一个问题很明显WHERE q.flag = 1 应该在最后。
  • 实际上这就是解决方案 :) 您应该将其发布为答案 ;)
  • Abhik Chakraborty 不,它不起作用。我的 sql 语法出现 #1064 错误
  • 你遇到了什么错误?
  • 嗯,我看到重复选择这是不允许的。您首先选择了q.que1_name,q.qa1,q.que2_name,然后在第 3、4 和 5 行再次添加了它们。删除重复的选择。

标签: php sql join


【解决方案1】:

因为你搞砸了语法顺序......

多连接的工作方式如下:

select u.user_name,u.user_emailid,u.user_mobno,     q.que1_name,q.qa1,q.que2_name,q.qa2,q.que3_name,q.qa3,q.que4_name,q.qa4,q.que5_name,q.qa5,q.    que6a_name,q.qa6a,q.que6b_name,q.qa6b,q.que7_name,q.qa7,

r1.ref_name,r1.ref_email,r1.ref_mobno,   q.que1_name,q.qa1,q.que2_name,q.qa2,q.que3_name,q.qa3,q.que4_name,q.qa4,q.que5_name,q.qa5,q.    que6a_name,q.qa6a,q.que6b_name,q.qa6b,q.que7_name,q.qa7,

r2.ref_name,r2.ref_email,r2.ref_mobno,  q.que1_name,q.qa1,q.que2_name,q.qa2,q.que3_name,q.qa3,q.que4_name,q.qa4,q.que5_name,q.qa5,q.    que6a_name,q.qa6a,q.que6b_name,q.qa6b,q.que7_name,q.qa7,

r3.ref_name,r3.ref_email,r3.ref_mobno, q.que1_name,q.qa1,q.que2_name,q.qa2,q.que3_name,q.qa3,q.que4_name,q.qa4,q.que5_name,q.qa5,q.    que6a_name,q.qa6a,q.que6b_name,q.qa6b,q.que7_name,q.qa7

from question q
LEFT JOIN user u USING(user_id)
LEFT JOIN reference_1 r1 USING(ref_id_1)
LEFT JOIN reference_2 r2 USING(ref_id_2)
LEFT JOIN reference_3 r3 USING(ref_id_3)
WHERE q.flag = 1

最后必须在哪里... 连接必须完整说明,不能混用。依赖项中的顺序工作您可以拥有 sub 和 subsub 等依赖项而没有问题。

你做得很好的一件事:你在两个 JOIN 表中为外键设置了相同的名称。 在这种情况下,您可以简单地替换 r1.t1 = r2.t2 的东西,并在函数 USING(t1) 中定义连接表。 :)

【讨论】:

  • Steini 我无法使用此查询获取任何 ref_name、ref_email、ref_mobno
  • Steini 我无法使用查询获取 reference_1、reference_2 和 reference_3 记录,感谢您指导我使用函数 USING()
【解决方案2】:

试试这个查询。对问题表的引用表使用嵌套连接。

   SELECT u.user_name
    ,u.user_emailid
    ,u.user_mobno
    ,q.que1_name
    ,q.qa1
    ,q.que2_name
    ,q.qa2
    ,q.que3_name
    ,q.qa3
    ,q.que4_name
    ,q.qa4
    ,q.que5_name
    ,q.qa5
    ,q.que6a_name
    ,q.qa6a
    ,q.que6b_name
    ,q.qa6b
    ,q.que7_name
    ,q.qa7
    ,r1.ref_name
    ,r1.ref_email
    ,r1.ref_mobno
    ,r2.ref_name
    ,r2.ref_email
    ,r2.ref_mobno
    ,q.que1_name
    ,r3.ref_name
    ,r3.ref_email
    ,r3.ref_mobno
FROM dbo.user u
LEFT JOIN question q
LEFT JOIN reference_1 r1 ON r1.ref_id_1 = q.ref_id_1
LEFT JOIN reference_2 r2 ON r2.ref_id_2 = q.ref_id_2
LEFT JOIN reference_3 r3 ON r3.ref_id_3 = q.ref_id_3 ON u.user_id = q.user_id
WHERE q.flag = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多