2016-09-06 2 views
-1

를 반환하는 기록을 그룹화 나는 다음과 같은 두 개의 테이블이 있습니다MySQL은 그룹 BY가있는

Products 
+--------------------------+--------------+------+-----+---------+-------+ 
| Field     | Type   | Null | Key | Default | Extra | 
+--------------------------+--------------+------+-----+---------+-------+ 
| id      | int(6)  | NO | PRI | NULL |  | 
| productName    | varchar(255) | YES |  | NULL |  | 
| landColour    | varchar(255) | YES |  | NULL |  | 
+--------------------------+--------------+------+-----+---------+-------+ 

Skus 
+--------------+---------------+------+-----+---------+-------+ 
| Field  | Type   | Null | Key | Default | Extra | 
+--------------+---------------+------+-----+---------+-------+ 
| id   | int(11)  | NO | PRI | NULL |  | 
| product_id | int(11)  | NO | MUL | NULL |  | 
| colour  | varchar(255) | NO | MUL | NULL |  | 
| fit   | varchar(255) | NO | MUL | NULL |  | 
| size   | decimal(10,1) | NO | MUL | NULL |  | 
| stock_status | varchar(255) | NO | MUL | NULL |  | 
| image  | varchar(255) | NO |  | NULL |  | 
+--------------+---------------+------+-----+---------+-------+ 

Product Data 
+----+--------------+------------+ 
| id | productName | landColour | 
+----+--------------+------------+ 
| 1 | Running Shoe | Red  | 
| 2 | Smart Shoe | Green  | 
| 3 | Casual Shoe | Blue  | 
+----+--------------+------------+ 

Sku Data 
+----+------------+--------+--------------+------+--------------+----------------+ 
| id | product_id | colour | fit   | size | stock_status | image   | 
+----+------------+--------+--------------+------+--------------+----------------+ 
| 1 | 1   | Red | Standard Fit | 5 | In-Stock  | /img/img1.jpg | 
| 2 | 1   | Green | Standard Fit | 5 | In-Stock  | /img/img2.jpg | 
| 3 | 1   | Blue | Standard Fit | 5 | In-Stock  | /img/img3.jpg | 
| 4 | 1   | Red | Standard Fit | 6 | Out-of-Stock | /img/img4.jpg | 
| 5 | 1   | Green | Standard Fit | 6 | In-Stock  | /img/img5.jpg | 
| 6 | 1   | Blue | Standard Fit | 6 | In-Stock  | /img/img6.jpg | 
| 7 | 2   | Red | Standard Fit | 5 | Out-of-Stock | /img/img7.jpg | 
| 8 | 2   | Green | Standard Fit | 5 | Out-of-Stock | /img/img8.jpg | 
| 9 | 2   | Blue | Standard Fit | 5 | Out-of-Stock | /img/img9.jpg | 
| 10 | 2   | Red | Standard Fit | 6 | In-Stock  | /img/img10.jpg | 
| 11 | 2   | Green | Standard Fit | 6 | Out-of-Stock | /img/img11.jpg | 
| 12 | 2   | Blue | Standard Fit | 6 | In-Stock  | /img/img12.jpg | 
| 13 | 3   | Red | Standard Fit | 5 | In-Stock  | /img/img13.jpg | 
| 14 | 3   | Green | Standard Fit | 5 | In-Stock  | /img/img14.jpg | 
| 15 | 3   | Blue | Standard Fit | 5 | In-Stock  | /img/img15.jpg | 
| 16 | 3   | Red | Standard Fit | 6 | In-Stock  | /img/img16.jpg | 
| 17 | 3   | Green | Standard Fit | 6 | In-Stock  | /img/img17.jpg | 
| 18 | 3   | Blue | Standard Fit | 6 | In-Stock  | /img/img18.jpg | 
+----+------------+--------+--------------+------+--------------+----------------+ 

Desired Results 
+------------+--------+--------+------+----------------+ 
| product_id | sku_id | colour | size | image   | 
+------------+--------+--------+------+----------------+ 
| 1   | 1  | Red | 5 | /img/img1.jpg | 
| 1   | 5  | Green | 6 | /img/img5.jpg | 
| 2   | 10  | Red | 6 | /img/img10.jpg | 
| 3   | 15  | Blue | 5 | /img/img15.jpg | 
| 3   | 18  | Blue | 6 | /img/img18.jpg | 
+------------+--------+--------+------+----------------+ 

내가 크기별로 그룹화 fit = 'Standard Fit'stock_status = 'In-Stock' 모두의 SKU를 검색하기 위해 노력하고 있지만, skus.colour 필드에 일치하는 경우 그러면 products.landColour 열이 내 선호 레코드입니다. 목표는 각 제품에 대해 재고가있는 모든 크기에 대해 sku 레코드를 갖도록하고, 선호하면 토지 색상과 동일한 색상을 사용하는 것입니다. 나는 완전히 당신이 뭘 하려는지 따르지 않는

SELECT 
    p.productName AS name, 
    p.id AS product_id, 
    IF(s1.size IS NULL, s2.size, s1.size) AS size, 
    IF(s1.image IS NULL, s2.image, s1.image) AS image, 
    IF(s1.fit IS NULL, s2.fit, s1.fit) AS fit 
FROM products p 
LEFT JOIN skus s1 ON 
    p.id = s1.product_id 
    AND s1.stock_status = 'In-Stock' 
    AND s1.colour = p.landColour AND 
    s1.fit = 'Standard Fit' 
LEFT JOIN skus s2 ON 
    p.id = s2.product_id 
    AND s2.stock_status = 'In-Stock' 
    AND s2.fit = 'Standard Fit' 
GROUP BY size 
HAVING (image IS NOT NULL AND size IS NOT NULL) 
+0

는 http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very보기 -simple-sql-query? noredirect = 1 # comment391934_333952 – Strawberry

+0

샘플 데이터와 원하는 결과는 원하는 것을 설명하는 데 도움이됩니다. –

+0

몇 가지 샘플 데이터와 원하는 결과를 추가했습니다. – geoffs3310

답변

0

: 이것은 내가 거의 바로 어떤 시도했지만 꽤, 일부 기록들은 재고가있는 경우에도 반환되지 않는 것입니다. 그러나,이 매우 의심 :

GROUP BY size 

나는 당신이 원하는 것을 의심 :

GROUP BY p.productName, p.id 
0

내가 하나와 함께 할 것입니다 가입하고 "선호"항목을 표시하는 열을 추가 할 수 있습니다. 그렇다면 귀하의 주문은 모든 선호에 따라 결정될 수 있습니다. 이 경우, 각 제품에 대해 선호하는 색상이 발견되면 플래그가 생기고 1 (나중의 정렬 용)을 얻습니다. 그렇지 않으면 # 1 선호 이후에 오는 것입니다.

SELECT 
     p.productName AS name, 
     p.id product_id, 
     s1.size, 
     s1.image, 
     s1.fit, 
     if(s1.colour = p.landColour, 1, 2) as PreferredFlag 
    FROM 
     products p 
     LEFT JOIN skus s1 
      ON p.id = s1.product_id 
      AND s1.stock_status = 'In-Stock' 
      AND s1.fit = 'Standard Fit' 
    GROUP BY 
     size, 
     if(s1.colour = p.landColour, 1, 2) as PreferredFlag 
    HAVING 
      image IS NOT NULL 
     AND size IS NOT NULL 
    order by 
     if(s1.colour = p.landColour, 1, 2), 
     size 

지금, 당신은 정말 크기에 의한 경우를 제외하여 그룹을 보증 것이고, 그건 그냥 자격이 주어진 크기에 대한 첫 번째 제품 이름과 ID 초래되는 모든 집계를하고 있지 않습니다. 실제로 아래와 같이 조정해야 할 수도 있습니다. 이 경우 선호하는 플래그 COUNTER로 원하는 색상과 일치하는 카운트의 SUM이 표시됩니다. 또한 색상에 관계없이 주어진 제품 이름과 크기가 실제로 얼마나 많은지에 대한 COUNT 개를 사용할 수 있습니다.

마지막 ORDER BY는 다음을 기반으로합니다. 일치하는 색상의 총 개수가> 0이면 1을 얻습니다. 그렇지 않으면 정렬 목적으로 2, 크기별로 정렬합니다.

SELECT 
     p.productName AS name, 
     p.id product_id, 
     s1.size, 
     s1.image, 
     s1.fit, 
     COUNT(*) as NumberAvailable, 
     SUM(if(s1.colour = p.landColour, 1, 0)) as PreferredFlag 
    FROM 
     products p 
     LEFT JOIN skus s1 
      ON p.id = s1.product_id 
      AND s1.stock_status = 'In-Stock' 
      AND s1.fit = 'Standard Fit' 
    GROUP BY 
     p.productName 
    HAVING 
      image IS NOT NULL 
     AND size IS NOT NULL 
    order by 
     if(SUM(if(s1.colour = p.landColour, 1, 0)) > 0, 1, 2) as PreferredFlag, 
     size