作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
用户表
id u_id name phone email
1 912 abcd 23424 abcd@email.com
2 913 xyz 45342 xyz@email.com
3 916 pqrt 23239 wdiw@email.com
主题表
s_id name
1 eng
2 math
3 phy
城市表
c_id name
1 city1
2 city2
3 city3
位置表
l_id name
1 loc1
2 loc2
3 loc3
user_to_subject 表
u_id s_id
913 2
913 3
user_to_city 表
u_id c_id
913 1
913 3
user_to_location 表
u_id l_id
913 2
913 3
我想做的是选择一个包含完整细节的语句,这就是我尝试过的。
SELECT U.*, GROUP_CONCAT(S.`name`) AS subject, GROUP_CONCAT(C.`name`) AS class, GROUP_CONCAT(L.`name`) AS location FROM `user` U INNER JOIN `user_to_subject` UTS ON U.`u_id`=UTS.`u_id` INNER JOIN `subjects` S ON S.`s_id`=UTS.`s_id` INNER JOIN `user_to_class` UTC ON U.`u_id`=UTC.`u_id` INNER JOIN `city` C ON C.`c_id`=UTC.`c_id` INNER JOIN `user_to_location` UTL ON U.`u_id`=UTL.`u_id` INNER JOIN `location` L ON L.`l_id`=UTL.`l_id` WHERE U.`u_id`=913
我有重复的主题、城市和位置。不确定我在这里做错了什么。
最佳答案
对于您的情况,最简单的解决方案是使用 group_concat(distinct)
:
SELECT U.*,
GROUP_CONCAT(DISTINCT S.`name`) AS subject,
GROUP_CONCAT(DISTINCT C.`name`) AS class,
GROUP_CONCAT(DISTINCT L.`name`) AS location
FROM `user` U INNER JOIN
`user_to_subject` UTS
ON U.`u_id` = UTS.`u_id` INNER JOIN
`subjects` S
ON S.`s_id` = UTS.`s_id` INNER JOIN
`user_to_class` UTC
ON U.`u_id` = UTC.`u_id` INNER JOIN
`city` C
ON C.`c_id` = UTC.`c_id` INNER JOIN
`user_to_location` UTL
ON U.`u_id` = UTL.`u_id` INNER JOIN
`location` L
ON L.`l_id`=UTL.`l_id`
WHERE U.`u_id` = 913;
这不是最通用的解决方案,因为它将所有中间结果生成为笛卡尔积(针对每个用户)。因此,如果您有 2 个类别、3 个位置和 4 个城市,那么会生成 24 个中间行。
24 行对于这个查询来说不是问题。但是,如果您有 200 个类(class)、300 个位置和 400 个城市,则中间结果会稍大一些。最通用的解决方案是预先聚合结果或使用相关子查询。
此外,如果您想保留缺少一个或多个属性的用户,您可能需要 LEFT JOIN
而不是 INNER JOIN
。
关于mysql - 多选语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33962756/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!