假设我有一个用户和首选项表,以及一个桥接表
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\u首选项
桌子
现在我想查询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个不同的用户。我知道
distinct
和
group by
关键字,它不能解决问题,因为它只会返回用户的单个首选项,而用户可以有多个首选项。
如何使用一条select语句实现这一点?