Mysql select 具有各自偏好的不同用户
Mysql select distinct user with each of their own preference
假设我有一个用户和偏好 table,以及两者之间的桥梁 table 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
table.
现在我想查询 10 个不同的用户,并且所有用户都包含他们自己的首选项,无论是空首选项还是多个首选项,如何为此构建一个 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 */
如您所见,结果将 return 重复 user1
,并且不会是 10 个不同的用户。我知道 distinct
和 group by
关键字,它不能解决问题,因为它只会 return 一个用户的单一偏好,而用户可以有多个偏好.
如何用一个 select 语句做到这一点?
试试这个。
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() 将为每个用户创建一个 comma-separated 首选项列表。
专业提示。当表变得非常大时,更改 ENUM 以添加更多值会变得非常 time-consuming。另外,设计一个数据库通常是不明智的,因为随着它的增长,它需要大量的 ALTER TABLE 语句。因此,如果您希望您的可能偏好是 open-ended.
,那么您概述的方法是正确的方法
假设我有一个用户和偏好 table,以及两者之间的桥梁 table 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
table.
现在我想查询 10 个不同的用户,并且所有用户都包含他们自己的首选项,无论是空首选项还是多个首选项,如何为此构建一个 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 */
如您所见,结果将 return 重复 user1
,并且不会是 10 个不同的用户。我知道 distinct
和 group by
关键字,它不能解决问题,因为它只会 return 一个用户的单一偏好,而用户可以有多个偏好.
如何用一个 select 语句做到这一点?
试试这个。
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() 将为每个用户创建一个 comma-separated 首选项列表。
专业提示。当表变得非常大时,更改 ENUM 以添加更多值会变得非常 time-consuming。另外,设计一个数据库通常是不明智的,因为随着它的增长,它需要大量的 ALTER TABLE 语句。因此,如果您希望您的可能偏好是 open-ended.
,那么您概述的方法是正确的方法