2014-07-27 5 views
0

다음 쿼리를 시도하고 MySQL에서 오류가 발생했습니다. 나는 그것이 왜 나에게 구문 오류 (그것은 같은 라인에서 실행되는 두 개의 DISTINCT 쿼리와 관련이 있음)를 던지고 있지만 여전히 그 가능성 (어떻게 든)을 믿는다. 두 개의 열 card_typesplit_type은 각각 5 가지 값 ("공격", "기초", "문자", "자산", "작업") 중 하나를 포함합니다. "공격"이 card_type 또는 split_type에 나타나면 레코드를 +1로 계산하는 쿼리를 만듭니다. 나는 SQL 쿼리를 열 A 또는 B 열 중 하나의 조건을 충족 결과의 총 수를 반환 할 것이라고 기대했다두 개의 고유 쿼리 중 COUNT (*)를 수집하는 방법은 무엇입니까?

:

SELECT DISTINCT(ufs.card_type), DISTINCT(ufs.split_type), COUNT(*) AS COUNT 
    FROM jg1_products p 
    LEFT JOIN jg1_product_types pt ON p.products_type = pt.type_id 
    LEFT JOIN jg1_products_to_categories ptc ON p.products_id = ptc.products_id 
    LEFT JOIN jg1_cards_ufs ufs ON ufs.products_id = p.products_id 
WHERE type_handler LIKE "%product_cards%" 
    AND ptc.categories_id = 89 
GROUP BY ufs.card_type 

나는 내 설명에 BIT 명확해야한다 생각

예 :"Attack"이라는 단어가 A 열 또는 B 열 중 하나에 표시되면이를 1로 계산하십시오.

"Attack"이라는 단어가 A 열에 표시되지만 B 열에 "Foundation"이라는 단어가 포함되어 있으면 +1 공격이되고 +1은 Foundation에 해당됩니다.

결국/SQL 함수는 두 개의 열 사이에 단어 (다섯 가지 가능성 중 하나)가 나타날 수있는 횟수로 반환합니다. 그래서 짧게 나는 "DISTINCT"명령을 사용했다. (잘못 추가 할 것이다) 그래서 A 열에있는 모든 구별되는 값들이 반환되고 B에 대해서도 같은 값이 반환된다.

+1

MySQL의 집계 [SUM()'] (http://www.mysqltutorial.org/mysql-sum/) 함수를 사용해 보셨습니까? –

+0

아니요. 숫자가 아닌 값이기 때문에'sum() '을 어떻게 사용하는지 모르겠다. 두 개의'SELECT' 질의를하고 그 값을 합한 것이 아니라면? –

+0

그럴 수도있다. 질문의 제목은 mi 썰매 나, 그래서 그걸 제안했다. –

답변

2

Q : "card_type 또는 split_type에"Attack "이 나타나면 레코드를 +1하는 쿼리."

대답 : 반환 할 결과 집합이 명확하지 않습니다. 내가 올바르게 이해 해요 경우 SELECT에 의해 반환 된 행이 예제 같은 것을한다면

편집 귀하의 코멘트/설명을 바탕으로

, :

card_type split_type 
--------- ----------- 
Attack  Attack 
Attack  Foundation 
Attack  Crescendo 
Foundation Foundation 

당신은 결과 집합을 원한다

Attack  3 
Foundation 2 
Crescendo 1 

3 개의 행의 값이이므로 "공격"에 대해 3을 반환합니다.은 card_type 또는 split_type입니다. 즉, 을 입력하지 않으면에 4의 값이 반환되는 횟수가 반환됩니다.

결과를 얻으려면 COUNT 집합체를 사용하여 이것을 두 개의 개별 쿼리로 실행하고 UNION ALL 집합 연산자를 사용하여 두 쿼리의 결과를 결합합니다. 첫 번째 쿼리는 단지 card_type만큼 카운트를 얻고 두 번째 쿼리는 split_type만큼 카운트를 얻습니다. "트릭"은 에 대한 두 번째 쿼리의 경우 이 card_type과 일치하는 모든 행을 제외합니다.

두 개의 조합 된 쿼리는 인라인보기로 사용되며 외부 쿼리는 SUM() 집계 함수를 사용하여 개별 카운트를 결합합니다.

는이 같은 양식 뭔가를 사용하여 쿼리를 할 것 :

SELECT c.type 
    , SUM(c.cnt) AS cnt 
    FROM (SELECT ufs.card_type AS `type` 
       , COUNT(1) AS cnt 
      FROM ... 

      GROUP BY ufs.card_type 

      UNION ALL 

     SELECT ufs.split_type AS `type` 
       , COUNT(1) AS cnt 
      FROM ... 

      AND NOT (ufs.split_type <=> ufs.card_type) 
      GROUP BY ufs.split_type  
     ) c 
GROUP BY c.type 

당신은 위의 쿼리에서 ... 교체, 원래 쿼리 두 배의 행 원본을 연결 것입니다.


이전 답 :

당신이 선택하려는 행을 반환하는 SELECT는 하나의 '트릭'조건부 테스트를 수행하기 위해 SELECT 목록에서 식을 사용하는 것입니다 있다고 가정하고, 반환 중 하나 0 또는 1, 다음 사양을 충족 레코드의 "수"를 반환하는 SUM() 집계를 사용 ...이 쿼리는 원래 쿼리와는 달리, 하나의 행을 반환

SELECT SUM(IF(ufs.card_type LIKE '%Attack%' OR ufs.split_type LIKE '%Attack%',1,0)) AS cnt 
    FROM jg1_products p 
    LEFT JOIN jg1_product_types pt ON p.products_type = pt.type_id 
    LEFT JOIN jg1_products_to_categories ptc ON p.products_id = ptc.products_id 
    LEFT JOIN jg1_cards_ufs ufs ON ufs.products_id = p.products_id 
WHERE type_handler LIKE "%product_cards%" 
    AND ptc.categories_id = 89 

그 여러 행을 반환합니다. 당신이 반환 원하는 결과 집합 (다시 말하지만, 그것은 분명하지 않다, 당신은 실제로 우리가 GROUP BY ufs.card_type 절을 포함하는 경우 반환되는 각각 별개의 card_type에 대한 카운트를 반환 할 경우

MySQL은 또한 부울 표현식을 위해 편리한 축약을 제공합니다. : 부울 식의 평가는 1을 반환 0, TRUE 경우 경우 FALSE 및 NULL NULL 따라서이 표현하는 경우 :.

SELECT SUM(ufs.card_type LIKE '%Attack%' OR ufs.split_type LIKE '%Attack%') 
    FROM ... 

이 NULL 값의 처리를 제외하고, 위의 쿼리의 표현에 해당합니다.

확인 하시겠습니까? 열이 문자열의 일부로 'Attack' 문자열을 "포함"하거나 전체 문자열 인 경우; 컬럼의 값이 'Attack' 정확하게 일치인지 확인하는 대신 LIKE

SELECT SUM(ufs.card_type = 'Attack' OR ufs.split_type = 'Attack') AS cnt 
    FROM ... 

참고

DISTINCT는 함수가 아닙니다의 동등 비교를 사용, 그것은 키워드입니다.

유효한 구문은 SELECT DISTINCT expr1, expr2, ... exprN FROM ...입니다.

DISTINCT 키워드를 SELECT 키워드 뒤에 여러 번 넣거나 SELECT 바로 다음에 올리면 안됩니다.합니다 (DISTINCT 키워드도 COUNT() 집계 함수, 예를 들어 SELECT COUNT(DISTINCT expr)을 포함하지만, 그 SELECT DISTINCT보다는 완전히 다르다 할 수있다. 괄호는 완전히 무시됩니다

합니다. 즉, SELECT DISTINCT(foo)SELECT DISTINCT foo와 동일합니다. 괄호를 포함하는 것은 전적으로 불필요하고, 차종 그것은 마치 DISTINCT와 같은 기능입니다.

+0

나는 그런 식으로 명확하지 않다는 점에 유감이다. 나는 SQL 쿼리가 Column A 또는 Column B 중 하나에서 조건을 충족시킨 결과의 총 개수를 반환하기를 바랬다. 예를 들어 "Attack"이라는 단어가 A 열 또는 B 열 중 하나에 나타나면 그 수를 1로 계산하십시오. Attack이라는 단어가 A 열에 나타나지만 B 열에 "Foundation"이라는 단어가 포함되어 있으면 공격에 +1, Foundation에 +1이됩니다. 결국/SQL 함수는 두 개의 열 사이에 단어 (다섯 개의 가능성 중 하나)가 표시되는 횟수로 돌아갑니다. –

+0

답변을 편집하면 실제로 PHP로 얻으려고했던 결과보다 효과적입니다. 감사! –

-1

이 시도 :

SELECT COUNT(DISTINCT(ufs.rarity)) AS COUNT ... 

이 코드를 즐기십시오!

1

당신은 당신을 도울 수 Link 자세한 내용은 card_typesplit_type

에서 고유 한 레코드를 선택합니다

여기
SELECT DISTINCT ufs.card_type, ufs.split_type, COUNT(*) AS COUNT 
    FROM jg1_products p 
    LEFT JOIN jg1_product_types pt ON p.products_type = pt.type_id 
    LEFT JOIN jg1_products_to_categories ptc ON p.products_id = ptc.products_id 
    LEFT JOIN jg1_cards_ufs ufs ON ufs.products_id = p.products_id 
WHERE type_handler LIKE "%product_cards%" 
    AND ptc.categories_id = 89 
GROUP BY ufs.card_type 

쿼리 쿼리 아래에 시도 할 수 있습니다.

+0

내가 링크 한 콘텐츠가 닫힙니다. (구체적으로 "COUNT() 함수 및 여러 열에서 DISTINCT가있는 SELECT"절의 내용을 참조하십시오. - 자세한 내용은 다음을 참조하십시오. http://www.w3resource.com/sql/select-statement/queries-with-distinct- multiple-columns.php # sthash.zjqiZoUy.dpuf) 이것은 하나의 칼럼에서 벗어나는 대신 2 개로 수행하려고합니다. –

관련 문제