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