【问题标题】:Pending friend request query for friends table and grabbing data from other tables对朋友表的待处理朋友请求查询并从其他表中获取数据
【发布时间】:2013-11-16 11:07:23
【问题描述】:

要获得所选用户的待处理请求,我使用:

SELECT f1.asker_user_id AS friend_id
FROM friends AS f1 
LEFT JOIN friends AS f2
    ON f1.asked_user_id = f2.asker_user_id
    AND f1.asker_user_id = f2.asked_user_id   
WHERE f1.status = 1 AND f2.status IS NULL
AND f1.asked_user_id = 2

http://www.sqlfiddle.com/#!2/0f7a0d5/65 正确返回用户 3.VALUES (3,2,1)

但我想获取有关此用户 3 的更多数据。

我需要来自users 表的name_surnameavatar。 以及来自connections 表的该用户的所有word_ids,作为回报,将根据word_id 显示来自words_enword

感谢分配!

附言我试过这个:

SELECT a.name_surname,GROUP_CONCAT(Distinct w.word Order by w.word asc) AS words
FROM (
  SELECT f1.asked_user_id AS friend_id,
       f1.created,
       u.name_surname,
       u.avatar
  FROM friends AS f1 
  LEFT JOIN friends AS f2 ON f1.asked_user_id = f2.asker_user_id
  INNER JOIN users AS u ON f1.asked_user_id = u.id
       AND f1.asker_user_id = f2.asked_user_id
  WHERE f1.status = 1 AND f2.status IS NULL
       AND f1.asker_user_id = 2
) a
LEFT JOIN connections c ON c.user_id = a.friend_id 
LEFT JOIN words_en w ON c.word_id = w.id
GROUP BY 1;

【问题讨论】:

    标签: mysql sql join subquery


    【解决方案1】:

    这里是以下查询的SQL Fiddle,我认为您需要的是。

    SELECT users.name_surname, users.avatar,
    GROUP_CONCAT(DISTINCT words_en.word Order by words_en.word asc) AS words
    FROM 
    (
    SELECT f1.asker_user_id AS friend_id
        FROM friends AS f1 
        LEFT JOIN friends AS f2
            ON f1.asked_user_id = f2.asker_user_id
            AND f1.asker_user_id = f2.asked_user_id   
        WHERE f1.status = 1 AND f2.status IS NULL
        AND f1.asked_user_id = 2
    ) AS MainQ
    INNER JOIN users ON MainQ.friend_id = users.id
    INNER JOIN connections ON users.id = connections.user_id
    INNER JOIN words_en ON words_en.id = connections.word_id
    

    【讨论】:

    • @Red Balloon,通过添加 GROUP_CONCAT 修复。
    【解决方案2】:

    根据这个问题和你之前的问题,我想你可能正在寻找这样的东西:

    SELECT u.name_surname, 
           u.avatar,
           GROUP_CONCAT(DISTINCT w.word Order by w.word asc) AS words
    FROM users u
    INNER JOIN 
    (
    SELECT f1.asker_user_id AS friend_id
        FROM friends AS f1 
        LEFT JOIN friends AS f2
            ON f1.asked_user_id = f2.asker_user_id
            AND f1.asker_user_id = f2.asked_user_id   
        WHERE f1.status = 1 AND f2.status IS NULL
        AND f1.asked_user_id = 2
    ) a ON a.friend_id = u.id
    LEFT JOIN connections c ON u.id = c.user_id
    LEFT JOIN words_en w ON w.id = c.word_id
    GROUP BY u.id;
    

    sqlfiddle demo

    【讨论】:

    • 这和灵儿的方式有什么区别。它们似乎产生相同的结果,但似乎完全不同。
    • 这始终为用户提供,即使他们没有单词,并按 name_surname 对他们进行分组。然后它按 u.id 对它们进行分组(我从 1 编辑到 u.id,因为 u.i​​d 是唯一的)。只有当他们有联系和单词时,他的查询才会给出结果。
    • 再次感谢您的解释:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多