我正在尝试从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
中对应的每个条目的最后一行。
数据示例。
假设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中的所有数据。
此处不需要数据透视表,因为数据表示不同。
答案 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
依旧......