2012-06-28 3 views
0

각 OR에 대해 LIMIT 1과 같은 방법이 MySQL에 있는지 궁금합니다. 마찬가지로 MySQL 문 SELECT * FROM posts WHERE username = 'Johnny' OR username = 'Matthew' OR username = 'Andy' OR username = 'Sandra' ORDER BY date DESC이 있지만 각 사용자 이름 (또는이 경우에는 각 사람의 최신 게시물) 하나만 결과를 반환하고 싶습니다. 나는 SELECT * FROM posts WHERE (username = 'Johnny' LIMIT 1) OR (username = 'Matthew' LIMIT 1) OR (username = 'Andy' LIMIT 1) OR (username = 'Sandra' LIMIT 1) ORDER BY date DESC을 시도했지만 그게 내가 생각할 수있는 전부이다. 미리 감사드립니다. MatthewMySQL 한계 한도 OR

답변

2

당신은 별도의 쿼리 결합 UNION를 사용할 수 있습니다 또는

(SELECT * FROM posts WHERE username = 'Johnny' LIMIT 1) 
UNION ALL 
(SELECT * FROM posts WHERE username = 'Matthew' LIMIT 1) 
UNION ALL 
(SELECT * FROM posts WHERE username = 'Andy' LIMIT 1) 
UNION ALL 
(SELECT * FROM posts WHERE username = 'Sandra' LIMIT 1) 

을 그룹화 할 수 있습니다 사용자 이름에 의한 결과 :

SELECT * 
FROM  posts 
WHERE username IN ('Johnny','Matthew','Andy','Sandra') 
GROUP BY username 

위의 두 쿼리는 각각에 대해 불확정 한 행을 반환합니다. 사용자 (당신이 필요로하는 것이거나 그렇지 않을 수도 있음). 특정 행을 가져 오려면 MySQL이 원하는 행을 결정하는 방법을 지정하십시오.


UPDATE

는 각 사용자에 대한 가장 최근의 게시물을 획득하고 최신에서 가장 오래된 결과 집합 주문하려면 다음에 명시된 바와 같이

SELECT * 
FROM  posts NATURAL JOIN (
      SELECT username, MAX(date) AS date 
      FROM  posts 
      WHERE username IN ('Johnny','Matthew','Andy','Sandra') 
      GROUP BY username 
     ) AS t 
GROUP BY username -- only required if multiple posts might have the same date 
ORDER BY date DESC 
+0

여기에 사용 된 UNION ALL과 아래에 사용 된 UNION의 차이점은 무엇입니까? 또한,'ORDER BY date DESC'와 동등한 작업을 수행하는 방법은 무엇입니까? D : – MatthewSot

+0

@IMAPC : "UNION의 기본 동작은 중복 된 행이 결과에서 제거된다는 것입니다. 옵션 인'DISTINCT' 키워드는 아무 효과가 없습니다 선택 사항 인'ALL' 키워드를 사용하면 중복 행 제거가 발생하지 않고 결과에 모든 SELECT 문에서 일치하는 모든 행이 포함됩니다. 따라서'ALL'을 추가하는 것은 복제본을 스캔하고 제거하기 위해 MySQL을 필요로하지 않는다면 더 효율적입니다. 중복이 불가능하기 때문에 여기서는 마찬가지입니다. – eggyal

+0

@IMAPC : 'DESD 날짜순으로 주문하기'라고 말하면, 각 사용자의 가장 최근 게시물을 임의의 순서로 반환하거나 각 사용자의 게시물을 내림차순으로 반환하기를 원한다는 의미입니까? 또는 둘 다 : 각 사용자의 가장 최근 게시물을 내림차순으로 반환 하시겠습니까? – eggyal

0

노조를 사용하는 것은 어떻습니까? @eggyal 보정 덕분에 편집

:

(SELECT * FROM posts WHERE username = 'Johnny' LIMIT 1) 
UNION 
(SELECT * FROM posts WHERE username = 'Matthew' LIMIT 1) 
UNION 
(SELECT * FROM posts WHERE username = 'Andy' LIMIT 1) 
+2

:

(SELECT * FROM posts WHERE username = 'Johnny' ORDER BY date DESC LIMIT 1) UNION ALL (SELECT * FROM posts WHERE username = 'Matthew' ORDER BY date DESC LIMIT 1) UNION ALL (SELECT * FROM posts WHERE username = 'Andy' ORDER BY date DESC LIMIT 1) UNION ALL (SELECT * FROM posts WHERE username = 'Sandra' ORDER BY date DESC LIMIT 1) ORDER BY date DESC 

과 [매뉴얼] (http://dev.mysql.com/doc/en/union.html) : "ORDER BY 또는 L을 적용하려면 IMIT'을 개별적인'SELECT'로 옮기고,'SELECT'를 묶는 괄호 안에 절을 넣으십시오. " – eggyal

+0

하지만 모든 결과를 정렬하려면 (다른 모든 SELECT의 결과와 마찬가지로) 어떻게해야합니까? 마지막에 'ORDER BY 날짜 DESC'를 넣어야합니까?) – MatthewSot

+0

죄송합니다. 링크 된 설명서에 다음에 물어볼 때까지 읽어야 할 수도 있습니다 ( – MatthewSot