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