我是数据库和mysql的新手。我很难确定我面临的问题究竟是什么,并且不知道相关的谷歌搜索会是什么。如果这是一个令人费解的迟钝问题,请原谅我。我有两个表tabs
和cats
。
tabs
是这样的:
name | order
tab1 | 3
tab2 | 0
tab3 | 1
tab4 | 2
cats
是这样的:
name | tab_name
cat1 | tab3
cat2 | tab3
cat3 | tab1
cat4 | tab1
cat5 | tab1
我猜这是一对多的关系标签到猫。我的问题是如何构建一个只返回不同选项卡名称的查询,每个选项卡都包含所有相关的猫?我可以得到所有猫和许多重复标签的结果。或者我只能获得不同的标签,但每个标签只能有一只猫。也许我应该用我的PHP代码测试重复的标签?或查询选项卡然后查询每个选项卡的所有猫?看起来似乎必须采用更直接的方式。我目前正在使用此查询:
SELECT t.name AS tab, c.name AS cat FROM tabs t
LEFT JOIN categories c
ON t.name=c.tab_name
ORDER BY t.order;
答案 0 :(得分:3)
您可以使用MySQL的GROUP_CONCAT()
生成逗号分隔的cat
列表,如果这是您想要的:
SELECT
t.name AS tab,
GROUP_CONCAT(c.name) AS cats
FROM
tabs t
LEFT JOIN categories c ON t.name = c.tab_name
GROUP BY tab
ORDER BY t.`order` /* ORDER is a reserved keyword and has to be quoted as `order` */
这会产生如下输出:
tab cats
------------------------------
Tab1 Cat1,Cat2,Cat3,Cat4
Tab2 Cat4,Cat3,Cat6,Cat7
每个tab
生成多行的查询是一种更常规的处理方式。在您的应用程序代码中,您将遍历tab cat
对并测试tab
的更改。如果您使用上面的GROUP_CONCAT()
,则还需要将其拆分为应用程序代码中的,
。
无论哪种方式,您都无法在SQL中逐行获得分层结果 - 您必须为每一行重复tab
。这只是结果集的二维结构的本质。因此,它需要一些应用程序端处理。
答案 1 :(得分:2)
SQL不适合分层查询;但是,您的查询输出非常适合在应用程序内部进行处理:
$tabs = array();
while ($row = $stmt->fetch()) {
$tabs[$row['tab']][] = $row['cat'];
}
如果您还需要不同的类别:
$tabs[$row['tab']][$row['cat']] = $row['cat'];
它生成一个二维数组,其中选项卡作为第一维,类别作为第二维。