所以,我理解这些关系如何在mysql中运行,但我很难弄清楚它是如何在我的代码中实现的。
例如,假设我有3个表。
表1:用户 - 用户ID,用户名,用户城市
表2:类别 - 类别ID,类别名称
表3:user_categories - 用户ID,类别ID
如果我要查询数据库中某个特定城市的每个用户,并列出他们所属的所有类别......我该怎么做?我是否需要遍历结果并为每个用户执行单独的查询,然后列出结果?或者,是否有一些魔术查询将返回多维数组?
我相信上面会是多对多的,如果我错了,请纠正我......
编辑在user_categories表中,用户可以包含多个类别,我正在尝试弄清楚如何返回所有这些
谢谢!
答案 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。