Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL Group BY,具有返回分组记录的优先级_Mysql_Sql_Phpmyadmin_Group By - Fatal编程技术网

MySQL Group BY,具有返回分组记录的优先级

MySQL Group BY,具有返回分组记录的优先级,mysql,sql,phpmyadmin,group-by,Mysql,Sql,Phpmyadmin,Group By,我有以下两个表格: Products +--------------------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------------------+--------------+------+-----+---------+-------+ | id

我有以下两个表格:

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 |
+------------+--------+--------+------+----------------+
我试图检索所有SKU,其中
fit='Standard fit'
stock\u status='In stock'
按大小分组,但如果skus.color字段与products.landcolor列匹配,则这是我的首选记录。这样做的目的是,对于每种产品,我都会有库存中每种尺寸的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 )

我不完全明白你想做什么。然而,这是非常可疑的:

GROUP BY size 
我怀疑你想要:

GROUP BY p.productName, p.id

我只需要一个连接,并添加一列来表示您的“首选”条目。然后,您的订单可以基于推到顶部的所有首选项以及随后的所有其他项。在本例中,对于每种产品,我只需要一个标志,如果找到首选颜色,它会得到1(用于以后的排序),否则2会出现在#1 preferred之后

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。实际上,您可能需要调整以适应以下情况。在本例中,我得到的计数总和与首选标志计数器所需的颜色相匹配。但也要计算一个给定的产品名称和尺寸的实际可用数量,无论颜色如何

最终订单以…为基础。。。如果匹配颜色的总计数大于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

查看示例数据和期望的结果将有助于解释您想要做什么。我现在添加了一些示例数据和期望的结果