请检查下面的表格
用户
id name
1 John
2 Peter
3 Predator
电话
id name
1 apple
2 nexus
3 nokva
phones_users
phone_id user_id
1 1
2 1
2 2
3 3
好的,我想得到这样的结果:
phone_id phone_name user_id user_name
1 apple 1 John
2 nexus 1 John
2 nexus 2 Peter
我尝试了一个请求,但它没有预期的工作
select `phones`.`name` as `phone_name`, `phones`.`created_at`, `phones`.`id`, `users`.`name` as `user_name`, `users`.`id` as `user_id` from `phones` left join `phones_users` on (`phones`.`id` = `phones_users`.`phone_id` and `phones_users`.`user_id` = 1) left join `users` on `phones_users`.`phone_id` = `phones`.`id` where `users`.`name` is not null;
我希望所有拥有ID = 1的用户的手机,以及拥有属于他的手机的所有用户..
例如,John有苹果和nexus,彼得有nexus,我想得到一张苹果,nexus,John,Peter的桌子。
感谢
答案 0 :(得分:1)
我附上了phones_users的副本并使用IF来区分手机是否属于同一个人。基于此我输出用户名和ID。
SELECT
`phones_users`.`phone_id`,
`phones`.`name` AS phone_name,
IF(`users`.`id` = `users2`.`id`, `users`.`id`, `users2`.`id`)
AS `user_id`,
IF(`users`.`id` = `users2`.`id`, `users`.`name`, `users2`.`name`)
AS `user_name`
FROM
phones_users
INNER JOIN
phones
ON
phones_users.phone_id=phones.id
INNER JOIN
users
ON
phones_users.user_id=users.id
INNER JOIN -- here I attach the copy of the table
phones_users AS phones_users2
ON
phones_users.phone_id=phones_users2.phone_id
INNER JOIN
users AS users2
ON
phones_users2.user_id=users2.id
WHERE
phones_users.user_id=1;
输出:
+----------+--------------+---------+-----------+
| phone_id | phone_name | user_id | user_name |
+----------+--------------+---------+-----------+
| 1 | apple iphone | 1 | John |
| 2 | nexus | 1 | John |
| 2 | nexus | 2 | Peter |
+----------+--------------+---------+-----------+
答案 1 :(得分:1)
-- We know the user details for this part of the query, so just hard-code them instead of query for them
SELECT phone_id, (SELECT name FROM phones WHERE id = pu.phone_id) AS phone_name, 1 AS user_id, "John" AS user_name
FROM phones_users pu
WHERE phone_id IN (SELECT phone_id
FROM phones_users
WHERE user_id = 1)
UNION ALL
SELECT p.id AS phone_id, p.name AS phone_name, u.id AS user_id, u.name AS user_name
FROM phones p, user u
WHERE u.id IN (SELECT user_id
FROM phones_users
WHERE user_id != 1
AND phone_id IN (SELECT phone_id FROM phones_users WHERE user_id = 1))
AND u.id = (SELECT user_id
FROM phones_users
WHERE phone_id = p.id)
转录为英文:
从表phone_id
中选择phones_users
,其中此ID位于John使用的电话ID列表中,以及具有此ID和值1的电话名称(约翰的ID) )和他的名字,“约翰”。
然后,追加到那里(这里开始变得更加复杂):
加入表phones
和users
所产生的行中的电话ID和名称以及用户ID和名称,但仅限于满足以下约束的行:
phones_users
中的用户ID列表中,与所连接行的电话ID位于同一行中,即该用户确实使用此电话(加入表{ {1}}和phones
会提供所有可能的组合,因此我们必须删除人们使用不使用手机的行。我希望你能理解转录和查询,如果不随意留下评论。
免责声明:我没有测试查询,它可能无法正常工作。