如何正确加入另一个查询?

时间:2011-11-18 04:30:02

标签: mysql

我需要计算重复的行,但只有在其中至少有一个状态=' 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 

4 个答案:

答案 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)