繁体   English   中英

Mysql 根据自己的喜好选择不同的用户

[英]Mysql select distinct user with each of their own preference

假设我有一个用户和首选项表,以及两者之间的桥表user_preference

/* user table:  */
+----------+--------------+
| Field    | Type         |
+----------+--------------+
| id       | int          |
| username | varchar(255) |
+----------+--------------+

/*  preference table: */
+------------+--------------+
| Field      | Type         |
+------------+--------------+
| preference | varchar(255) |
+------------+--------------+

/* user_preference table:  */
+-----------------+--------------+
| Field           | Type         |
+-----------------+--------------+
| user_id         | int          |
| preference_name | varchar(255) |
+-----------------+--------------+

例如,有 3 个偏好可供选择:“游泳”、“看电视”、“骑自行车”。 一个用户可以拥有零个或全部 3 个首选项,这反映在user_preference表中。

现在我想查询 10 个不同的用户,并且每个用户都包含他们自己的偏好,无论是 null 还是多个偏好,如何为此构造一个 select 语句?

到目前为止,我已经尝试过这样的事情:

SELECT u.*, p.preference_name 
FROM user u 
LEFT JOIN user_preference p ON p.user_id = u.id
LIMIT 10;

/* Result:  */
id | username | preference_name

1  | user1    | swimming
1  | user1    | cycling
2  | user2    | null
3  | user3    | watching TV
... /* rest of the result  */

如您所见,结果将返回重复的user1 ,并且不会是 10 个不同的用户。 我知道distinctgroup by关键字,它不能解决问题,因为它只会为用户返回一个偏好,而用户可以有多个偏好。

如何用一个单一的选择语句做到这一点?

尝试这个。

SELECT u.*, 
       GROUP_CONCAT(DISTINCT p.preference_name) AS prefs
  FROM user u 
  LEFT JOIN user_preference p ON p.user_id = u.id
 GROUP BY u.id
LIMIT 10;

GROUP_CONCAT() 将为每个用户创建一个以逗号分隔的首选项列表。

亲提示 当表变得非常大时,更改 ENUM 以添加更多值会非常耗时。 另外,设计数据库通常是不明智的,因此随着数据库的增长,它需要大量的 ALTER TABLE 语句。 因此,如果您希望您的可能偏好是开放式的,那么您概述的方法是正确的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM