我有这张桌子:
+--------+------+----------+
| fromId | toId | messages |
+--------+------+----------+
| 10 | 2 | 'text' |
| 10 | 4 | 'text' |
| 4 | 10 | 'text' |
| 5 | 10 | 'text' |
| 5 | 10 | 'text' |
| 10 | 3 | 'text' |
| 6 | 10 | 'text' |
+--------+------+----------+
每一行都是从fromId到theId的消息
如您所见,我有5个对话,其中涉及ID为10的用户:
10与2
10与4
10与5
10与3
10与6
如何在Select查询中对它们进行计数?
我试过这个:
SELECT * FROM messaggi WHERE fromId = 10 OR toID = 10 GROUP BY (fromId)
但有些东西告诉我,我必须从另一个SELECT尝试SELECT,我认为它被称为子查询。
答案 0 :(得分:0)
因此,我们需要找到任何方向上不同对话的总数。我们可以做的是查询结果并将它们结合在一起但是为其中一个查询切换列。这为我们提供了任何方向对话的所有结果。然后,我们可以计算不同的结果,以找出个人的谈话次数。
SELECT COUNT(DISTINCT *) FROM
(SELECT fromId as col1, toId as col2 FROM conversations WHERE fromId = 10
UNION
SELECT toId as col1, fromId as col2 FROM conversations WHERE toId = 10)
答案 1 :(得分:0)
答案等于此查询返回的行数:
SELECT DISTINCT from_id x FROM my_table WHERE to_id = 10
UNION
SELECT DISTINCT to_id x FROM my_table WHERE from_id = 10;
答案 2 :(得分:0)
如果我理解10, 5
与5, 10
相同,那么谁开始对话并不重要,那么:
<强> SQL DEMO 强>
SELECT COUNT(*)
FROM (SELECT DISTINCT
LEAST(`fromId`, `toId`) AS a,
GREATEST(`fromId`, `toId`) AS b
FROM Table1
WHERE 10 in (`fromId`, `toId`)
) T
答案 3 :(得分:0)
我建议你改变它的构造方式。有一个线程表:
TID
---
1
2
3
4
5
6
7
现在,每个线程可以拥有任何(现在2个)参与者数量。所以,让我们有参与者表。
TID | UID
----+----
1 | 10
1 | 2
2 | 10
2 | 4
3 | 4
3 | 10
4 | 5
4 | 10
5 | 5
5 | 10
6 | 10
6 | 3
7 | 6
7 | 10
现在,如果您以不同的方式找到参与者的计数:
SELECT DISTINCT(GROUP_CONCAT(`UID` ORDER BY `UID` ASC)) FROM participants GROUP BY `TID`
你明白了:
最后,用COUNT
包裹它会给你5
:
SELECT COUNT(*) FROM (SELECT DISTINCT(GROUP_CONCAT(`UID` ORDER BY `UID` ASC)) FROM `participants` GROUP BY `TID`) AS T