2

我是数据库和 mysql 的新手。我什至很难确定我面临的问题是什么,而且我真的不知道相关的谷歌搜索会是什么。如果这是一个令人难以置信的智障问题,请原谅我。我有两张桌子tabscats.

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;
4

2 回答 2

3

如果这是您想要的,您可以使用 MySQLGROUP_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为每一行重复。这就是结果集的二维结构的本质。所以它需要一些应用程序端的处理。

于 2012-11-30T02:40:48.100 回答
2

SQL 不是最适合分层查询的;但是,您的查询输出非常适合在应用程序内部进行处理:

$tabs = array();
while ($row = $stmt->fetch()) {
    $tabs[$row['tab']][] = $row['cat'];
}

如果您还需要不同的类别:

    $tabs[$row['tab']][$row['cat']] = $row['cat'];

它生成一个二维数组,其中选项卡作为第一个维度,类别作为第二个维度。

于 2012-11-30T03:08:22.520 回答