mySQL选择查询,从多个表中获取数据

时间:2016-01-22 06:17:01

标签: php mysql database join

我正在尝试从mySql DB获取数据。共有9个表,我必须从所有表中相应地显示产品列表。

我想过使用JOIN并尝试LEFT JOIN,如下所示:

$query="SELECT table1.*,tbl2.*,tbl3.*,tbl4.*,tbl5.*,tbl6.*,tbl7.*",tbl8.*,tbl9.* FROM 
table1 
LEFT JOIN tbl2 ON table1.pid=tbl2.pid 
LEFT JOIN tbl3 ON table1.pid=tbl3.pid 
LEFT JOIN tbl3 ON table1.pid=tbl4.pid ... and so on upto tbl9 GROUP BY table1.pid";

此处Table1是主表,pid为FK,表示从tbl2到tbl9的所有表。

注意:这里我在所有表上都使用了.*来避免长查询,但在实际的数据库操作中,只提到了特定的列以提高性能。

  

现在实际问题是我没有使用LEFT JOIN从表中获取所有记录。仅检索table1中对应的每个条目的最后一行。

  • 我使用GROUP BY来避免使用LEFT JOIN重复输入。

数据示例。

假设table1有一个标识为2的商品,那么tbl2,tbl3等中有多个条目...参考标识2

如何在没有重复行的情况下从其他表中获取所有数据。

表格结构

table1

 id     |     name   |     lastName  
 ---------------------------------------
 1      |    john    |      doe
 2      |    helen   |      keller    

table2

 The userID column is a foreign key that references John Doe, so John orders 3 items.

  id     |   userID   |     order 
  ---------------------------------------
  1      |    1       |      pizza
  2      |    1       |      pasta
  3      |    1       |      lasagna    

Table3

userID列是引用John Doe的外键,因此John留下5条评论。

    id     |   userID  |     rating   |  comment
    -------------------------------------------------
    1      |    1       |      5/5     |  was good
    2      |    1       |      5/5     |  excellent
    3      |    1       |      4/5     |  great
    4      |    1       |      4/5     |  great
    5      |    1       |      4/5     |  great

表格结构是从HERE复制的,因为它与我的相同。

结果如下:

id name lastname order order1 order2  MoreDetails
-------------------------------------------------
1  John  doe     pizza pasta  lasgana  click to view

现在,当人们点击视图时,会显示一个弹出窗口,其中包含表3中的所有数据。

此处不需要数据透视表,因为数据表示不同。

4 个答案:

答案 0 :(得分:1)

您要求的数据透视表可能包含无限列,以及某种加载相关数据的用户界面/交互。这不是SQL数据库的工作方式。

我能得到的最接近的是:

SELECT table1.*, GROUP_CONCAT(table2.order) AS orders, 'click to view' AS MoreDetails
FROM table1
LEFT JOIN table2 ON table1.id = table2.userID
GROUP BY table1.id

这会将订单组合成一个名为orders的列中以逗号分隔的列表,而“点击查看”只是一个字符串。用户交互可以在PHP中处理,您可以接收用户点击的id然后运行新查询以检索相关信息:

SELECT * FROM table3 WHERE userID = $id

答案 1 :(得分:1)

数据库: Postgresql

试试这个:

SELECT t1.id, t1.name, t1.lastname, (array_agg(t2.order))[1] as order, 
(array_agg(t2.order))[2] as order1, (array_agg(t2.order))[3] as order2, 
'Clicks to view' as "Moredetails"
FROM table1 as t1 
LEFT JOIN table2 as t2 ON t1.id = t2."userID" 
LEFT JOIN table3 as t3 ON t1.id = t3."userID" 
WHERE t1.id = 1 
GROUP BY 1,2,3

输出:

id name lastname order order1 order2  MoreDetails
-------------------------------------------------
1  John  doe     pizza pasta  lasgana  click to view

答案 2 :(得分:0)

不完全确定您想要获得什么结果。考虑到您想要获取每个表上的条目的产品信息,至少一次,那么您需要将这些事件组合在一起,在子查询中对它们进行分组(以避免重复)并显示每个条目的详细信息找到了产品。

SELECT table1.* FROM table1 inner join (
SELECT pid FROM tbl2 WHERE your_filter = ?
UNION
SELECT pid FROM tbl3 WHERE your_filter = ?
UNION
SELECT pid FROM tbl4 WHERE your_filter = ?
UNION
...
GROUP BY pid) as subqueryIds
on table1.pid = subqueryIds.pid

如果您不需要对每张桌子进行任何过滤,则可以完全压制WHERE

不确定这是否是您要找的。希望它有所帮助。

答案 3 :(得分:0)

尝试根据

之类的关系加入表格
SELECT table1.*,tbl2.*,tbl3.*,tbl4.*,tbl5.*,tbl6.*,tbl7.*,tbl8.*,tbl9.* FROM 
table1 
LEFT JOIN tbl2 ON table1.pid=tbl2.pid 
LEFT JOIN tbl3 ON table2.pid=tbl3.pid 

依旧......