Mysql双选或内连接

时间:2013-05-20 12:48:19

标签: mysql join inner-join

我有两个MySql表。

其中一个存储有关产品的一般数据(名称,图像,描述)。

table name: product
table fields: id, name, desc, brand, image, status

第二个存储产品的不同变化(尺寸,颜色,价格,促销价格)。

table name: product_variation
table fields: product_id, size, color, price, prom_price, status

我不知道的是如何显示第二个表中价格排序的第一个表中的产品,考虑到第二个表中有多个行具有相同的产品ID,但不同尺寸,颜色和价格当然。默认情况下,应考虑price字段,但如果prom_price字段中的数据大于0,则应考虑prom_price。

编辑:我需要的结果是第一个表中每个产品的一个实例,第二个表中的最低价格(来自第二个表中该产品的所有变体)

2 个答案:

答案 0 :(得分:0)

SELECT * FROM product p
INNER JOIN product_variation pv
ON p.id = pv.product_id
ORDER BY pv.prom_price, pv.price

这将复制您的产品行,无论您有多少变体(并在相关字段中显示所有这些变体)。它首先按prom_price订购,如果它是0(或不唯一),则按价格订购。

编辑:如果您希望将产品保留在一起,您可能需要GROUP BY p.id.

答案 1 :(得分:0)

这是一种方法,使用左连接找到产品(价格或prom_price)上最便宜的价格,然后按该价格订购。使用常见的表表达式可以很容易地删除重复的CASE表达式,但遗憾的是,MySQL没有这些表达式: - /

SELECT p.name FROM products p
JOIN product_variations pv1 ON p.id=pv1.product_id
LEFT JOIN product_variations pv2 ON pv1.product_id = pv2.product_id
 AND CASE WHEN pv1.prom_price<>0 THEN pv1.prom_price ELSE pv1.price END >
     CASE WHEN pv2.prom_price<>0 THEN pv2.prom_price ELSE pv2.price END
WHERE pv2.product_id IS NULL
ORDER BY CASE WHEN pv1.prom_price<>0 THEN pv1.prom_price ELSE pv1.price END;

An SQLfiddle to test with