很多很多mysql都有棘手的条件

时间:2014-09-06 20:04:29

标签: mysql many-to-many

请检查下面的表格

用户

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

sqlfiddle

好的,我想得到这样的结果:

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的桌子。

感谢

2 个答案:

答案 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) )和他的名字,“约翰”。 然后,追加到那里(这里开始变得更加复杂): 加入表phonesusers所产生的行中的电话ID和名称以及用户ID和名称,但仅限于满足以下约束的行:

  • 该行的用户ID位于用户ID的用户ID列表中,该用户ID的电话ID与电话John(ID为1的用户)的ID相同,即该用户不是John但使用相同的用户ID打电话给约翰,
  • 并且用户ID位于表phones_users中的用户ID列表中,与所连接行的电话ID位于同一行中,即该用户确实使用此电话(加入表{ {1}}和phones会提供所有可能的组合,因此我们必须删除人们使用不使用手机的行。

我希望你能理解转录和查询,如果不随意留下评论。

免责声明:我没有测试查询,它可能无法正常工作。

相关问题