2011-11-18 4 views
1

반복되는 행을 계산해야하지만 적어도 하나의 행에 status = '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 

내 생각이 반복되는 URL을 계산하고 RIGHT '새'가되도록 나머지 행이 사라 같은 테이블 있지만 상태에서만 행 =으로 가입하기 위해 기본적으로.

SELECT `userFlags` distinct(URL) WHERE Status = "new" 

어떻게 조인 테이블에 이러한 조건을 추가합니까?

편집

나는 상태 쿼리에 = "새로운"내가 어떻게 구별 (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

이 시도 :

Select userFlags.URL,Count(Status) AS SUM from userFlags 
where Status = "new" 
group by userFlags.URL 

편집 대신, INNER을 외부 조인의

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 
+1

감사합니다. "고지"행을 계산해야합니다. 한 행에 "new"상태가 있으면 "new"가 아니더라도 같은 URL을 가진 모든 행을 계산해야합니다. – lisovaccaro

+1

조건은 상태가 new 인 행만 유지하기 때문에이 방법은 작동하지 않습니다. OP의 샘플에서 URL = 1 일 때 따라서 행을 놓치게됩니다. –

+0

그래, 나는 그것을 읽었다. 당신의 대답은 틀렸다. 쿼리가 URL = 1 일 때 잘못된 SUM을 반환합니다. –

0

가입 :

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; 

을 더 행이없는 경우 조인 conditi 일치 on이면 결과 집합에 행이 추가되지 않습니다. 이렇게하면 상태가 new 인 행이 하나 이상없는 모든 URL이 필터링됩니다.

편집 : HAVING을 삭제했습니다. 어떤 이유로 URL이 두 번 이상 나타나는 행만 필요하다고 생각했습니다.

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** 
+0

감사합니다. 이것은 내가하고 싶었던 바로 그 것이다. 내가 수락 할께. – lisovaccaro

+0

시간이 너무 오래갑니다. – Itay

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) 
관련 문제