PHP / MySQL - * -to-Many关系

时间:2010-02-25 18:28:02

标签: php mysql

所以,我理解这些关系如何在mysql中运行,但我很难弄清楚它是如何在我的代码中实现的。

例如,假设我有3个表。

表1:用户 - 用户ID,用户名,用户城市

表2:类别 - 类别ID,类别名称

表3:user_categories - 用户ID,类别ID

如果我要查询数据库中某个特定城市的每个用户,并列出他们所属的所有类别......我该怎么做?我是否需要遍历结果并为每个用户执行单独的查询,然后列出结果?或者,是否有一些魔术查询将返回多维数组?

我相信上面会是多对多的,如果我错了,请纠正我......

编辑在user_categories表中,用户可以包含多个类别,我正在尝试弄清楚如何返回所有这些

谢谢!

3 个答案:

答案 0 :(得分:2)

你是绝对正确的,这是一个多对多的查询。 根据我的理解,您正在寻找的是能够显示某种分层结果,这意味着对于一个用户来说,拥有他所分配的所有类别的数组......

你可以做的事情: 选项1:查询用户表:

SELECT u.user_id, u.username, u.user_city WHERE city = 'somecity';

从结果中获取匹配的所有user_id,将它们放在一个数组中。

array(1,3,4,5)

然后通过加入2个表类别和user_categories执行查询,并将数组作为逗号分隔列表传递到以下位置:

SELECT user_categories.user_id, categories.category_name
FROM user_categories INNER JOIN categories ON user_categories.category_id = categories.category_id
WHERE user_categories.user_id IN (1,3,4,5)

这将为您提供一个用户ID,类别名称列表,您可以在脚本中使用以前的结果来构建结果集

选项2:我的首选,使用MySQL的GROUP_CONCAT(http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat)。

SELECT users.user_id, users.user_name, GROUP_CONCAT(categories.category_name) AS categories
FROM users
INNER JOIN user_categories ON users.id = users_categories.user_id
INNER JOIN categories ON user_categories.category_id = category.id
WHERE user.user_city = 'somecity'
GROUP BY user.user_id

这将返回如下内容:

user_id       username      categories
1             u1            cat1, cat2, cat3
2             u2            cat1, cat3

您可以在group_concat中使用SEPARATOR指定分隔符。

答案 1 :(得分:0)

您需要加入表格。

如果我要查询特定城市中每个用户的数据库,并列出他们所属的所有类别

SELECT *
FROM users
INNER JOIN user_categories
  ON (user_id)
INNER JOIN categories
  ON (category_id)
WHERE ...

答案 2 :(得分:0)

你可以尝试:

SELECT u.user_id, u.username, u.user_city, c.category_id, c.category_name
FROM users u 
INNER JOIN user_categories uc ON u.user_id = uc.user_id
INNER JOIN categories c ON uc.category_id = c.category_id
WHERE u.user_city = 'Cityname';

我没有对此进行过测试,可能有更有效的方法,但它应该可行。

如果您不熟悉mysql中的联接,请检查this