需要一些 sql 方面的幫助。往下看我的sql代碼片段。
create table product
(
id int auto_increment primary key,
title text null,
stock int default 0 not null,
price float(9,2) default 0.00 not null
);
create table product_property_value
(
id int auto_increment primary key,
product_id int not null,
property_id int not null,
value varchar(255) null
);
create table property
(
id int auto_increment primary key,
code varchar(20) null,
title varchar(50) null
);
我有一個陳述句,用于從這三個表中選擇所有行并具有漂亮的輸出。
SELECT
title,
stock,
price,
(
SELECT GROUP_CONCAT(p.title, ': ', pv.value SEPARATOR ', ')
FROM product_property_value pv
INNER JOIN property p on pv.property_id = p.id WHERE pv.product_id = product.id
) property_values
FROM product;
我的屬性表中充滿了以下資料:
insert into property (id, code, title) values (1, 'color', 'Color');
insert into property (id, code, title) values (2, 'width', 'Width');
insert into property (id, code, title) values (3, 'height', 'Height');
我的 product_property_value 表充滿了這些資料(一種產品有一個示例,表中有很多):
insert into product_property_value (id, product_id, property_id, value) values (4, 2, 1, 'Green');
insert into product_property_value (id, product_id, property_id, value) values (5, 2, 2, 4);
insert into product_property_value (id, product_id, property_id, value) values (6, 2, 3, 4);
所以主要的問題是如何僅選擇具有指定值的產品: 選擇 color = "Red", width=4 或 width=5 and height = 5 的產品。我需要修改陳述句或更改它,但無論如何我需要保存美化輸出。歡迎回復,謝謝。
uj5u.com熱心網友回復:
如果您的 MySql 版本支持橫向派生表,那么您可以嘗試使用它。
SELECT title, stock, price, property_values
FROM product prod
, LATERAL (
SELECT ppv.product_id
, MAX(CASE WHEN prop.code = 'color' THEN ppv.value END) AS color
, MAX(CASE WHEN prop.code = 'width' THEN ppv.value END) AS width
, MAX(CASE WHEN prop.code = 'height' THEN ppv.value END) AS height
, GROUP_CONCAT(prop.title, ': ', ppv.value SEPARATOR ', ') AS property_values
FROM product_property_value ppv
LEFT JOIN property prop ON prop.id = ppv.property_id
WHERE ppv.product_id = prod.id
GROUP BY ppv.product_id
HAVING color = 'Red'
AND width IN (4, 5)
AND height = 5
) propies
ORDER BY title;
或者只是加入他們。
SELECT prod.title, stock, price
, GROUP_CONCAT(prop.title, ': ', ppv.value SEPARATOR ', ') AS property_values
FROM product prod
JOIN product_property_value ppv
ON ppv.product_id = prod.id
JOIN property prop
ON prop.id = ppv.property_id
AND prop.code IN ('color', 'width', 'height')
GROUP BY prod.id, prod.title, stock, price
HAVING COUNT(CASE
WHEN prop.code = 'color' AND ppv.value = 'Red'
THEN ppv.id END) > 0
AND COUNT(CASE
WHEN prop.code = 'width' AND ppv.value IN (4, 5)
THEN ppv.id END) > 0
AND COUNT(CASE
WHEN prop.code = 'height' AND ppv.value = 5
THEN ppv.id END) > 0
ORDER BY prod.title;
標題 | 庫存| 價格| 屬性值 :---- | ----: | ----: | :------------------------------ 豆| 42 | 10.00 | 顏色:紅色,寬度:4,高度:5
關于db<>fiddle 的演示在這里
uj5u.com熱心網友回復:
我認為您的 sql 陳述句需要有一個 where 子句。一種方法是:
SELECT
title,
stock,
price,
(
SELECT GROUP_CONCAT(p.title, ': ', pv.value SEPARATOR ', ')
FROM product_property_value pv
INNER JOIN property p on pv.property_id = p.id WHERE pv.product_id = product.id
) property_values
FROM product WHERE property_values='Color: Red, Width: 4, Height: 5' OR property_values='Color: Red, Width: 5, Height: 5';
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/370183.html
