编辑:我知道,我的数据库没有正常化,但我无法改变它,谢谢。
我有一个名为user_dialogs
的表格,其中包含id, user_id, dialog_id, type, status, created_at
和updated_at
字段。
我找不到使用dialog_id
在user_id 1
和user_id 2
之间检索现有type='PRIVATE'
的好方法。
我尝试使用IN:user_id IN(1,2) and type='PRIVATE'
,但我得到用户1使用用户3制作的dialog_id
。
在user 1和2之间获取dialog_id的最佳方法是什么?
如何调用此问题/算法?我不知道。
提前致谢!
答案 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
一个dialogue
和user_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
表格自身GROUP
和user_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 |
现在您有一个用户和对话的邻接列表。