我试图从mySql DB
获取数据。总共有9个表格,我必须相应地从所有表格中显示产品列表。
我考虑过使用连接,并尝试了左连接,如下所示:
$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是从tbl2到tbl9的所有表的FK
。
注意:这里我在所有表上使用了.*
来避免长查询,但是在实际的数据库操作中,只提到特定的列来提高性能。
现在实际的问题是,我没有得到所有的记录从表使用左加入。只检索table1
中对应的每个条目的最后一行。
数据示例。
假设table1
有一个id为2
的产品,那么tbl2、tbl3等中有多个条目。。参考id2
。
如何在没有重复行的情况下也从其他表获取所有数据。
表结构
表1
id | name | lastName
---------------------------------------
1 | john | doe
2 | helen | keller
表2
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
表3
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
表结构是从这里复制的,因为它与我的相同。
结果应如下所示:
id name lastname order order1 order2 MoreDetails
-------------------------------------------------
1 John doe pizza pasta lasgana click to view
现在,当用户单击view时,将显示一个弹出窗口,其中包含表3中的所有数据。
这里不需要数据透视表,因为数据表示不同。
不完全确定您想要获得什么结果。考虑到您希望至少一次获得每个表中这些条目的产品信息,那么您需要对这些事件进行联合,在子查询中对它们进行分组(以避免重复),并显示找到的每个产品的详细信息。
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
s。
不确定这是否是你要找的。希望能有所帮助。
您需要一个可能具有无限列的透视表,以及某种加载相关数据的用户界面/交互。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
这将把订单合并到一个逗号分隔的列表中,列名为订单
,而“单击查看”只是一个字符串。可以在PHP中处理用户交互,您可以接收用户单击的id,然后运行新查询以检索相关信息:
SELECT * FROM table3 WHERE userID = $id
数据库:Postgreql
试试这个:
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
问题内容: 产生5行(5个数组),是一行中唯一的唯一字段。重复( 在这里 重复3次。 )我如何摆脱这些重复? 编辑: 我想要和所有为每个饮料。 问题答案: 您在这里所做的称为a (尽管您是隐式执行的,因为您是从多个表中选择的)。这意味着,如果您未在WHERE子句中放置任何条件,则您将拥有这些表的 所有组合 。仅根据您的条件,您才可以将联接限制为饮料ID匹配的行。 但是,如果有X张包含此特定Drin
我有一个Laravel后端和一个VueJS前端。 我试图在一个具有hasOne关系的模型上生成一个查询,但只从关系中选择特定的列,做一个sum和一个group By。 null
问题内容: 我正在运行此查询 但这不是我想要的结果,它返回多行。 我的一张桌子看起来像这个名字: 另一个表看起来像这个名字: 我如何使其选择查询,以便可以从两个表中获取与之相关的所有值,并使它看起来像这样 所需的输出: 谢谢!(提前!) 问题答案: 为您提供所需的输出(但这并不灵活,因此,如果添加要输出的更多详细信息,将无法进行更改而不进行更改):-
问题内容: 我有桌子: 我想写一个返回BookName,FirstName,LastName,RubricName的SELECT查询。 我有两个单独的查询,但我不知道如何在一个选择中编写此查询。这就是我得到的: 它工作正常,但如何在一个选择中编写? 我尝试这样做,但是不起作用: 它返回错误: 问题答案: 试试这个查询
我的表是: 我有一个包含10,000个地址的列表,如果地址存在于表中,我将循环访问该列表以检索相应的纬度/经度。 查询如下所示: 然后我检查结果集,看看是否有匹配。然后通过上面的查询循环其他9,999个地址,这花费的时间太长了。 是否有一种方法可以创建一个包含所有10000个地址的查询,并返回一个包含4列的结果集: 任何未找到地址在结果集列中都应该有一个空(0或null)纬度/经度值。我假设我可以
我有三张桌子: