我需要计算重复的行,但只有在其中至少有一个状态=' new'时才会在结果中显示它们。
______________
URL | Status
--------------
A new
A seen
B new
C seen
应该回应:
___________
URL | SUM
-----------
A 2 (counts both the seen one and the new one because there is at least one nwe)
B 1
我的想法基本上是计算重复的网址并使用相同的表格右键加入它,但只有状态=' new'这样剩下的行就会消失。
SELECT `userFlags` distinct(URL) WHERE Status = "new"
如何将这些条件添加到连接表中以及如何调用它?
修改
我添加了Status =" new"对于查询,如何添加distinct(URL)或将整个查询嵌套在其上?
SELECT userFlags.URL, COUNT( * ) AS SUM
FROM `userFlags`
RIGHT JOIN `userFlags` as u2 ON u2.Status = "new" AND userFlags.URL = u2.URL
GROUP BY u2.URL
ORDER BY SUM DESC
答案 0 :(得分:1)
一个可能的答案是:
SELECT userFlags.URL, COUNT( * ) AS SUM
FROM `userFlags`
JOIN (select distinct URL from userflags where status = 'new') as u2 on u2.url = userflags.url
GROUP BY u2.URL
ORDER BY SUM DESC **strong text**
答案 1 :(得分:0)
试试这个:
Select userFlags.URL,Count(Status) AS SUM from userFlags
where Status = "new"
group by userFlags.URL
修改
Select userFlags.URL,Count(Status) AS SUM from userFlags
where userFlags.URL in
(Select userFlags.URL from userFlags where Status = "new" )
group by userFlags.URL
答案 2 :(得分:0)
而不是OUTER JOIN,进行INNER JOIN:
SELECT U1.URL, COUNT(*) AS Foo
FROM userFlags U1
INNER JOIN userFlags U2
ON U1.URL = U2.URL
AND U2.Status = 'new'
GROUP BY U1.URL;
如果没有匹配连接条件的行,则该行不会添加到结果集中。这会筛选出任何至少没有一行Status = new的URL。
编辑:删除了HAVING,出于某种原因,我认为你只想要URL出现不止一次的行。
答案 3 :(得分:0)
无需正确加入。我认为那只会让你感到困惑。使用子查询来查找“新”行是一种策略。
select u2.URL, count(*) as SUM
from userFlags as u2
where u2.URL in (
select distinct u1.URL from userFlags as u1 where u1.Status = 'new'
) group by u2.URL;
或者,这可以写为连接而不是子查询。
select u2.URL, count(*) as SUM
from userFlags as u2
inner join (
select distinct u1.URL from userFlags as u1 where u1.Status = 'new'
) as subq on subq.URL = u2.URL
group by u2.URL;
任何一个都有效。这是一个快速测试来证明它:
mysql> create table userFlags (
-> URL varchar(255) not null,
-> Status enum('new', 'seen') not null,
-> index(URL),
-> index(Status)
-> ) engine=innodb;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into userFlags (URL, Status) values ('A', 'new'), ('A', 'seen'), ('B', 'new'), ('C', 'seen');
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from userFlags;
+-----+--------+
| URL | Status |
+-----+--------+
| A | new |
| A | seen |
| B | new |
| C | seen |
+-----+--------+
4 rows in set (0.00 sec)
mysql> select u2.URL, count(*) as SUM
-> from userFlags as u2
-> where u2.URL in (
-> select distinct u1.URL from userFlags as u1 where u1.Status = 'new'
-> ) group by u2.URL;
+-----+-----+
| URL | SUM |
+-----+-----+
| A | 2 |
| B | 1 |
+-----+-----+
2 rows in set (0.00 sec)
mysql> select u2.URL, count(*) as SUM
-> from userFlags as u2
-> inner join (
-> select distinct u1.URL from userFlags as u1 where u1.Status = 'new'
-> ) as subq on subq.URL = u2.URL
-> group by u2.URL;
+-----+-----+
| URL | SUM |
+-----+-----+
| A | 2 |
| B | 1 |
+-----+-----+
2 rows in set (0.01 sec)