【问题标题】:Select specific values from sql tables从 sql 表中选择特定值
【发布时间】:2021-11-30 18:12:20
【问题描述】:

在 sql 方面需要一些帮助。往下看我的sql代码sn-p。

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);

所以主要问题是如何选择仅具有指定值的产品: 选择颜色 =“红色”、宽度 = 4 或宽度 = 5 且高度 = 5 的产品。我需要修改语句或更改它,但无论如何我需要保存美化的输出。欢迎回答,谢谢。

【问题讨论】:

  • 您的标签中列出了 3 个单独的 RDBMS。请更新您的标签以反映您正在使用的实际 RDBMS,因为答案可能特定于该平台。
  • 提供的示例没有数据返回

标签: mysql sql database


【解决方案1】:

如果您的 MySql 版本支持Lateral Derived Tables,那么您可以尝试使用它。

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;
title stock price property_values
beans 42 10.00 Color: Red, Width: 4, Height: 5

dbfiddle here

上的演示

【讨论】:

  • 按预期工作!谢谢
  • 谢谢。顺便说一句,你会使用横向还是第二?一个警告,如果你要改变第二个的 GROUP BY,像SUM(stock) 这样的东西会给出错误的结果,因为与属性的多对多关系。您必须将其包装在子查询中。
  • 我想使用第二个选项,因为它对我来说更清楚
【解决方案2】:

我认为你的 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';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    相关资源
    最近更新 更多