mysql查询-计算用户之间的常用字数

mysql查询-计算用户之间的常用字数,mysql,sql,Mysql,Sql,我有一个非常好的查询,可以选择当前用户的朋友。在本例中,user_id=2。他的朋友是user_id=4 我希望使用相同的查询获取用户_id 2与所选朋友的字数。在这种情况下,他们有词=爱,这也是他们两个都有的词,所以我想在公共行中说=1 是否可以不更改太多当前查询 我应该从头开始吗 假设两个用户在单词表中都有一个“爱”的条目,那么可能是这样的:- SELECT b.name_surname, b.avatar, b.friend_words, (b.frien

我有一个非常好的查询,可以选择当前用户的朋友。在本例中,user_id=2。他的朋友是user_id=4

我希望使用相同的查询获取用户_id 2与所选朋友的字数。在这种情况下,他们有词=爱,这也是他们两个都有的词,所以我想在公共行中说=1

是否可以不更改太多当前查询

我应该从头开始吗


假设两个用户在单词表中都有一个“爱”的条目,那么可能是这样的:-

SELECT b.name_surname,
     b.avatar, 
     b.friend_words, 
     (b.friend_msg_id) AS friend_msg_id, 
     words_common.words_in_common,
     COUNT(m.id) AS unread_msg 
FROM 
(
    SELECT a.name_surname as name_surname,
        a.avatar as avatar,
        GROUP_CONCAT(DISTINCT w.word ORDER BY w.word ASC) AS friend_words,
        (a.friend_id) AS friend_msg_id
    FROM 
    (
        SELECT f1.asked_user_id AS friend_id,
            f1.created,
            u.name_surname,
            u.avatar
        FROM friends AS f1 
        INNER JOIN friends AS f2 
        ON f1.asked_user_id = f2.asker_user_id 
        AND f1.asker_user_id = f2.asked_user_id
        INNER JOIN users AS u ON f1.asked_user_id = u.id 
        WHERE f1.status = 1 AND f2.status = 1
        AND f1.asker_user_id = 2
    ) a
    LEFT JOIN connections c ON c.user_id = a.friend_id 
    AND c.invisible <> 1 AND c.deleted <> 1
    LEFT JOIN words_en w ON c.word_id = w.id 
    GROUP BY 1
) b
LEFT JOIN messages m ON m.to_user_id = 2
 AND m.from_user_id = b.friend_msg_id 
 AND m.seen = 0
LEFT OUTER JOIN 
(
    SELECT b.user_id AS friend_id, GROUP_CONCAT(a.word) AS words_in_common
    FROM words_en a
    INNER JOIN words_en b
    ON a.word = b.word
    WHERE a.user_id = 2
    GROUP BY b.user_id
) words_common
ON b.friend_msg_id = words_common.friend_id
GROUP BY b.name_surname, b.avatar, b.friend_words, b.friend_msg_id
ORDER BY unread_msg DESC
编辑-修改以使用连接表查找常用词:-

SELECT b.name_surname,
     b.avatar, 
     b.friend_words, 
     (b.friend_msg_id) AS friend_msg_id, 
     words_common.words_in_common,
     COUNT(m.id) AS unread_msg 
FROM 
(
    SELECT a.name_surname as name_surname,
        a.avatar as avatar,
        GROUP_CONCAT(DISTINCT w.word ORDER BY w.word ASC) AS friend_words,
        (a.friend_id) AS friend_msg_id
    FROM 
    (
        SELECT f1.asked_user_id AS friend_id,
            f1.created,
            u.name_surname,
            u.avatar
        FROM friends AS f1 
        INNER JOIN friends AS f2 
        ON f1.asked_user_id = f2.asker_user_id 
        AND f1.asker_user_id = f2.asked_user_id
        INNER JOIN users AS u ON f1.asked_user_id = u.id 
        WHERE f1.status = 1 AND f2.status = 1
        AND f1.asker_user_id = 2
    ) a
    LEFT JOIN connections c ON c.user_id = a.friend_id 
    AND c.invisible <> 1 AND c.deleted <> 1
    LEFT JOIN words_en w ON c.word_id = w.id 
    GROUP BY 1
) b
LEFT JOIN messages m ON m.to_user_id = 2
 AND m.from_user_id = b.friend_msg_id 
 AND m.seen = 0
LEFT OUTER JOIN 
(
    SELECT b.user_id AS friend_id, GROUP_CONCAT(c.word) AS words_in_common
    FROM connections a
    INNER JOIN connections b
    ON a.word_id = b.word_id
    INNER JOIN words_en c
    ON b.word_id = c.id
    WHERE a.user_id = 2
    GROUP BY b.user_id
) words_common
ON b.friend_msg_id = words_common.friend_id
GROUP BY b.name_surname, b.avatar, b.friend_words, b.friend_msg_id
ORDER BY unread_msg DESC

嘿,很抱歉没有解释这部分,但是单词是字典。它永远不会有爱情的双重输入。表连接保存用户标识字标识关系。这是需要找到复制品的地方。很公平,我明天早上会有一场戏。为什么要在word en表上显示“用户id”字段?它只是用来跟踪原始创建者的。为您做了一个修改的选择。您的FIDLE太小,没有用处。@我有一个更好的sql数据,但SQLFIDLE抱怨它太大。