0

假设我有这三个表:users、categories 和 users_categories(多对多)。

我正在尝试获取所有用户及其类别,所以它会是这样的:

SELECT users.*, GROUP_CONCAT(DISTINCT categories.name separator '/') clist 
FROM users
LEFT JOIN users_categories ON users_categories.user = users.id
LEFT JOIN categories ON categories.id = users_categories.category

很简单。现在,困难的部分是我想显示属于特定类别的所有用户,但仍然在 GROUP_CONCAT 中保持相同的类别列表。执行以下查询仅按预期显示特定类别中的用户,但会截断他所属的其余类别:

SELECT users.*, GROUP_CONCAT(DISTINCT categories.name separator '/') clist 
FROM users
LEFT JOIN users_categories ON users_categories.user = users.id
LEFT JOIN categories ON categories.id = users_categories.category
INNER JOIN categories cmust ON cmust.id = categories.id AND cmust.name = 'categoryhere'

我将如何更改最后一个查询?谢谢。

编辑:只有列名的示例数据:

用户表:

id, name:
1, myname
2, anothername
3, hisname

类别表:

id, name
1, music
2, art
3, sports

USERS_CATEGORIES 表:

user, category
1,1
1,2
2,2
3,1
3,3
3,2

没有搜索类别的所需查询结果(如我的第一个查询):

users.id,users.name,clist
1,'myname','music/art'
2,'anothername','art'
3,'hisname','music/sports/art'

具有搜索类别的所需查询结果。假设只有“音乐”类别中的用户。users.id,users.name,clist

1,'myname','music/art'
3,'hisname','music/sports/art'

最后一个是我想要完成的。我基本上只是想删除不在指定类别中的用户,并且仍然保留他们所属的其余类别。

4

3 回答 3

0

您可以通过从所需的类别开始,然后找到该/这些类别(/ies)中的用户,然后按照您的原始查询继续进行,从而获得您想要的结果。

这种方法的好处是您可以轻松地一次搜索多个类别,查找属于音乐或艺术类别的用户。

SELECT users.*, GROUP_CONCAT(DISTINCT categories.name separator '/') clist 
FROM categories C1
INNER JOIN users_categories UC1 ON UC1.category = C1.id
INNER JOIN users ON users.id = UC1.user
INNER JOIN users_categories ON users_categories.user = users.id
INNER JOIN categories ON categories.id = users_categories.category
WHERE C1.name IN ('music') 
group by users.id   
于 2013-04-11T21:15:41.207 回答
0

您可以简单地使用以下代码:

SELECT *
  FROM (
SELECT users.*, GROUP_CONCAT(DISTINCT categories.name separator '/') clist 
  FROM users
       LEFT JOIN users_categories ON users_categories.user = users.id
       LEFT JOIN categories ON categories.id = users_categories.category
       ) a
 WHERE '/'+a.clist+'/' LIKE '/'+'categoryhere'+'/';

WHERE注意:在子句的行中使用正确的 MySQL 字符串连接运算符。这会给你你想要的结果。

于 2013-04-11T19:47:42.327 回答
0

你可以找这个

    SELECT users.*, GROUP_CONCAT(DISTINCT categories.name separator '/') clist 
    FROM users
    LEFT JOIN users_categories ON users_categories.user = users.id
    LEFT JOIN categories ON categories.id = users_categories.category
    group by users.id

在这里演示

如果你想获得带有搜索类别的类别,你可以这样做

SELECT users.*, GROUP_CONCAT(DISTINCT categories.name separator '/')  clist 
FROM users
LEFT JOIN users_categories ON users_categories.user = users.id
LEFT JOIN categories ON categories.id = users_categories.category
group by users.id
having GROUP_CONCAT(DISTINCT categories.name separator '/') like '%music%'

在这里演示

于 2013-04-11T20:43:45.913 回答