MySQL:检索与两个用户ID相关的结果

时间:2016-08-26 19:54:42

标签: mysql sql

编辑:我知道,我的数据库没有正常化,但我无法改变它,谢谢。

我有一个名为user_dialogs的表格,其中包含id, user_id, dialog_id, type, status, created_atupdated_at字段。

我找不到使用dialog_iduser_id 1user_id 2之间检索现有type='PRIVATE'的好方法。

我尝试使用IN:user_id IN(1,2) and type='PRIVATE',但我得到用户1使用用户3制作的dialog_id

在user 1和2之间获取dialog_id的最佳方法是什么?

如何调用此问题/算法?我不知道。

提前致谢!

3 个答案:

答案 0 :(得分:2)

我的理解是,您希望找到在用户1和用户2之间共享的dialog_id,类型为' PRIVATE'对于两者。

一种解决方案是为类型=' PRIVATE'的用户1搜索所有dialog_id,然后搜索type =' PRIVATE&#的用户2的dialog_id' 39;这与用户1有共同之处

SELECT ud.dialog_id
FROM user_dialogs ud
WHERE type='PRIVATE'
AND user_id = 2
AND ud.dialog_id IN (
    SELECT dialog_id
    FROM user_dialogs
    WHERE type='PRIVATE'
    AND user_id = 1)

答案 1 :(得分:0)

SELECT
    dialog_id
    ,COUNT(DISTINCT user_id) as UserCount
    ,COUNT(*) as OccurenceCount
FROM
    user_dialogs
WHERE
    user_id IN (1,2)
    AND type = 'PRIVATE'
GROUP BY
    dialog_id
HAVING
    COUNT(DISTINCT user_id) > 1

答案 2 :(得分:0)

为了明确地,我们假设我们有以下模式来描述第三范式的数据。

CREATE TABLE user (id int);
CREATE TABLE dialogue (id int);
CREATE TABLE user_dialogue (user_id int, dialogue_id int);

有3张桌子。 user一个dialogueuser_dialogue表,用于描述用户和对话之间的多对多关系。

所以假设我们有3个用户,并且描述了2个对话...

INSERT INTO user VALUES(1),(2),(3);
INSERT INTO dialogue VALUES(1),(2);
INSERT INTO user_dialogue VALUES(1,1),(2,1),(1,2),(3,2),(3,1);

提取两个特定用户之间发生的拨号的一种方法是需要这样的查询,我们JOIN表格自身GROUPuser_id HAVING然后过滤掉那些结果使用SELECT d1.user_id, d1.dialogue_id FROM user_dialogue d1 JOIN user_dialogue d2 ON d1.dialogue_id = d2.dialogue_id GROUP BY d1.user_id; HAVING user_id IN (1,2) 子句存在任何一个id。

{{1}}

给我们所需的结果集......

|user_id | dialogue_id |
------------------------
| 1      | 1           |
| 2      | 1           |

现在您有一个用户和对话的邻接列表。