Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.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/79.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 查找公共属性的SQL查询_Mysql_Sql_Sql Server - Fatal编程技术网

Mysql 查找公共属性的SQL查询

Mysql 查找公共属性的SQL查询,mysql,sql,sql-server,Mysql,Sql,Sql Server,我有一个由ERP生成的带有3列的SQL表 +-----------+-----------+------------+ | ProductID | Attribute | Value | +-----------+-----------+------------+ | 100 | Size | Big | | 100 | Color | Red | | 100 | Weight | Heavy

我有一个由ERP生成的带有3列的SQL表

+-----------+-----------+------------+
| ProductID | Attribute |   Value    |
+-----------+-----------+------------+
|       100 | Size      | Big        |
|       100 | Color     | Red        |
|       100 | Weight    | Heavy      |
|       200 | Size      | Small      |
|       200 | Color     | Red        |
|       200 | Weight    | Light      |
|       300 | Size      | Big        |
|       300 | Color     | Green      |
|       300 | Weight    | Heavy      |
+-----------+-----------+------------+
我想查询表以查找具有匹配属性的产品。比如说

SELECT * FROM Table
WHERE Attribute ='Size' AND Value = 'Big' AND Attribute ='Weight' AND Value = 'Heavy' 

所以退回产品100和300。

有两种不同的方法可以做到这一点。下面是一个使用条件聚合的示例:

select productid
from yourtable
group by productid
having max(case when attribute = 'Size' then value end) = 'Big'
   and max(case when attribute = 'Weight' then value end) = 'Heavy'

您可以使用有条件的
和来执行此操作:

SELECT ProductID
FROM tbl
GROUP BY ProductID
HAVING
    SUM(
        CASE
            WHEN Attribute = 'Size' AND Value = 'BIG' THEN 1
            WHEN Attribute = 'Weight' AND Value = 'Heavy' THEN 1
            ELSE 0
        END
    ) = 2

如果您希望
ProductID
s具有其他属性,可以使用
=2

我相信您需要成对的产品。此外,我没有在任何地方硬编码值。如果需要更改属性集,只需修改
having
子句

select t1.ProductID, t2.ProductID
from
    T t1 inner join T t2
        on      t2.ProductID > t1.ProductID
            and t2.Attribute = t1.Attribute and t2.Value = t1.Value
group by
    t1.ProductID, t2.ProductID
having
        count(case when t1.Attribute = 'Size' then 1 end) = 1
    and count(case when t1.Attribute = 'Weight' then 1 end) = 1

我有点倾向于认为像Felix这样的答案就是你想要的。

另一种方法是使用传统的“透视查询”并将其视为“派生表”,然后将大小/重量/颜色作为行,从而简化筛选

MySQL 5.6架构设置

CREATE TABLE ERPout
    (`ProductID` int, `Attribute` varchar(6), `Value` varchar(5))
;

INSERT INTO ERPout
    (`ProductID`, `Attribute`, `Value`)
VALUES
    (100, 'Size', 'Big'),
    (100, 'Color', 'Red'),
    (100, 'Weight', 'Heavy'),
    (200, 'Size', 'Small'),
    (200, 'Color', 'Red'),
    (200, 'Weight', 'Light'),
    (300, 'Size', 'Big'),
    (300, 'Color', 'Green'),
    (300, 'Weight', 'Heavy')
;
SELECT
      ProductID
    , Size
    , Color
    , Weight
FROM (
      SELECT
            ProductID
          , MAX(CASE WHEN Attribute = 'Size' THEN VALUE END) AS Size
          , MAX(CASE WHEN Attribute = 'Color' THEN VALUE END) AS Color
          , MAX(CASE WHEN Attribute = 'Weight' THEN VALUE END) AS Weight
      FROM ERPout
      GROUP BY
            ProductID
      ) p
WHERE Size = 'Big'
      AND Weight = 'Heavy'
| ProductID | Size | Color | Weight |
|-----------|------|-------|--------|
|       100 |  Big |   Red |  Heavy |
|       300 |  Big | Green |  Heavy |
查询1

CREATE TABLE ERPout
    (`ProductID` int, `Attribute` varchar(6), `Value` varchar(5))
;

INSERT INTO ERPout
    (`ProductID`, `Attribute`, `Value`)
VALUES
    (100, 'Size', 'Big'),
    (100, 'Color', 'Red'),
    (100, 'Weight', 'Heavy'),
    (200, 'Size', 'Small'),
    (200, 'Color', 'Red'),
    (200, 'Weight', 'Light'),
    (300, 'Size', 'Big'),
    (300, 'Color', 'Green'),
    (300, 'Weight', 'Heavy')
;
SELECT
      ProductID
    , Size
    , Color
    , Weight
FROM (
      SELECT
            ProductID
          , MAX(CASE WHEN Attribute = 'Size' THEN VALUE END) AS Size
          , MAX(CASE WHEN Attribute = 'Color' THEN VALUE END) AS Color
          , MAX(CASE WHEN Attribute = 'Weight' THEN VALUE END) AS Weight
      FROM ERPout
      GROUP BY
            ProductID
      ) p
WHERE Size = 'Big'
      AND Weight = 'Heavy'
| ProductID | Size | Color | Weight |
|-----------|------|-------|--------|
|       100 |  Big |   Red |  Heavy |
|       300 |  Big | Green |  Heavy |

CREATE TABLE ERPout
    (`ProductID` int, `Attribute` varchar(6), `Value` varchar(5))
;

INSERT INTO ERPout
    (`ProductID`, `Attribute`, `Value`)
VALUES
    (100, 'Size', 'Big'),
    (100, 'Color', 'Red'),
    (100, 'Weight', 'Heavy'),
    (200, 'Size', 'Small'),
    (200, 'Color', 'Red'),
    (200, 'Weight', 'Light'),
    (300, 'Size', 'Big'),
    (300, 'Color', 'Green'),
    (300, 'Weight', 'Heavy')
;
SELECT
      ProductID
    , Size
    , Color
    , Weight
FROM (
      SELECT
            ProductID
          , MAX(CASE WHEN Attribute = 'Size' THEN VALUE END) AS Size
          , MAX(CASE WHEN Attribute = 'Color' THEN VALUE END) AS Color
          , MAX(CASE WHEN Attribute = 'Weight' THEN VALUE END) AS Weight
      FROM ERPout
      GROUP BY
            ProductID
      ) p
WHERE Size = 'Big'
      AND Weight = 'Heavy'
| ProductID | Size | Color | Weight |
|-----------|------|-------|--------|
|       100 |  Big |   Red |  Heavy |
|       300 |  Big | Green |  Heavy |
如果您只需要ProductID,这将是一个简短而有效的解决方案:

选择ProductID
从产品信息
其中Attribute='Size'和Value='Big'
或属性='Weight'和值='Heavy'
按产品ID分组
拥有计数(ProductID)=2
如果您需要一行中的所有属性,并且您已经在(ProductID,Attribute)上定义了(唯一/主)键,那么您可能希望使用如下查询:

选择size.ProductID、size.Value-size、color.Value-color、weight.Value-weight
从产品信息大小
使用(ProductID)加入产品信息权重
左连接产品信息颜色
关于color.ProductID=size.ProductID
属性='color'
其中size.Attribute='size'和size.Value='Big'
和weight.Attribute='weight'和weight.Value='Heavy'
如果您另外定义一个基于值的索引,那么性能会更好


这两个查询都使用WHERE子句,避免了完整的表/索引扫描。根据表大小和数据,这可能是一个巨大的优势,因为早期筛选。

您没有解释“查找具有匹配属性的产品”的含义:输入是什么?只是那个表,或者其他一些,或者一些参数/常量?当你询问时,为什么要询问?所需的查询应该是什么样子的?就输入而言,输出应该是什么样的?请给出输入和输出示例。PS为什么有两个不同的DBMS标记?MySQL和/或MS SQL Server?(不要给未涉及的产品贴标签…)哥们,这样效果更好。非常感谢,伙计。你是个救生员。