检查每行中的两列以匹配一组值
Checking two columns in each row to mach a set of values
一对多关系
我不是 mysql 的专家,所以我想我的问题有一些简单的解决方案。基本上:
如何单独检查每一行是否包含特定值(如果一行中的两列包含两个自定义值)。
由于 config__atribute__value table 的唯一索引上的 GROUP BY 运行,我知道如何检查第一行。但是,如果我想制作另一个 AND 检查其他行是否也匹配不同的值怎么办?
查询抽象表示:
SELECT price
FROM one
LEFT JOIN many
ON one.id = many.fk_one
WHERE (col1 = "some_value" AND col2 = "some_value") AND (col1 = "some_value" AND col2 = "some_value")
GROUP BY one.id
* 两行都必须 mach
(ONE) table product_config
id, product_type, inStock, inSale, price
1 "flyers A4" 1 1 800.00
(MANY) table config__atribute__value
id | fk_product_config | fk_product_atribute | fk_product_atribute_value
7 1 "color" "4/0"
8 1 "paper" "120g"
原查询:
下面的查询仅适用于一行。但是我怎样才能检查下一行?
SELECT price
FROM product_config p
LEFT JOIN config__atribute__value c
ON p.id = c.fk_product_config
WHERE (c.fk_product_atribute = "paper" AND c.fk_product_atribute_value = "120g")
GROUP BY p.id
这不会匹配任何内容,因为它正在检查每一行的所有值。
SELECT price
FROM product_config p
LEFT JOIN config__atribute__value c
ON p.id = c.fk_product_config
WHERE (c.fk_product_atribute = "paper" AND c.fk_product_atribute_value = "120g") AND (c.fk_product_atribute = "color" AND c.fk_product_atribute_value = "4/0")
GROUP BY p.id
理想情况下,如果我可以对每一行使用 ORDER BY,它会解决我的问题,当然这会引发错误。
SELECT price
FROM product_config p
LEFT JOIN config__atribute__value c
ON p.id = c.fk_product_config
WHERE (c.fk_product_atribute = "paper" AND c.fk_product_atribute_value = "120g")
GROUP BY p.id AND (c.fk_product_atribute = "color" AND c.fk_product_atribute_value = "4/0")
GROUP BY p.id
我添加这个是为了让你更好地理解我想做什么。
您尝试过使用 OR 代替 AND 吗?
WHERE
(c.fk_product_atribute = "paper" and c.fk_product_atribute_value = "120g")
OR
(c.fk_product_atribute = "color" and c.fk_product_atribute_value = "4/0")
让 INNER JOIN
为您代劳!
SELECT price FROM product_config p
INNER JOIN config__atribute__value c1 ON p.id = c1.fk_product_config
AND c1.fk_product_atribute = 'paper'
AND c1.fk_product_atribute_value = '120g'
INNER JOIN config__atribute__value c2 ON p.id = c2.fk_product_config
AND c2.fk_product_atribute = 'color'
AND c2.fk_product_atribute_value = '4/0'
由于使用内部联接,返回的唯一产品配置将是具有这两个属性且这些属性具有所需值的配置。
这可能证明了为什么 EAV 是构建关系数据的糟糕方法。您的查询变得庞大而复杂。
一对多关系
我不是 mysql 的专家,所以我想我的问题有一些简单的解决方案。基本上:
如何单独检查每一行是否包含特定值(如果一行中的两列包含两个自定义值)。
由于 config__atribute__value table 的唯一索引上的 GROUP BY 运行,我知道如何检查第一行。但是,如果我想制作另一个 AND 检查其他行是否也匹配不同的值怎么办?
查询抽象表示:
SELECT price
FROM one
LEFT JOIN many
ON one.id = many.fk_one
WHERE (col1 = "some_value" AND col2 = "some_value") AND (col1 = "some_value" AND col2 = "some_value")
GROUP BY one.id
* 两行都必须 mach
(ONE) table product_config
id, product_type, inStock, inSale, price
1 "flyers A4" 1 1 800.00
(MANY) table config__atribute__value
id | fk_product_config | fk_product_atribute | fk_product_atribute_value
7 1 "color" "4/0"
8 1 "paper" "120g"
原查询:
下面的查询仅适用于一行。但是我怎样才能检查下一行?
SELECT price
FROM product_config p
LEFT JOIN config__atribute__value c
ON p.id = c.fk_product_config
WHERE (c.fk_product_atribute = "paper" AND c.fk_product_atribute_value = "120g")
GROUP BY p.id
这不会匹配任何内容,因为它正在检查每一行的所有值。
SELECT price
FROM product_config p
LEFT JOIN config__atribute__value c
ON p.id = c.fk_product_config
WHERE (c.fk_product_atribute = "paper" AND c.fk_product_atribute_value = "120g") AND (c.fk_product_atribute = "color" AND c.fk_product_atribute_value = "4/0")
GROUP BY p.id
理想情况下,如果我可以对每一行使用 ORDER BY,它会解决我的问题,当然这会引发错误。
SELECT price
FROM product_config p
LEFT JOIN config__atribute__value c
ON p.id = c.fk_product_config
WHERE (c.fk_product_atribute = "paper" AND c.fk_product_atribute_value = "120g")
GROUP BY p.id AND (c.fk_product_atribute = "color" AND c.fk_product_atribute_value = "4/0")
GROUP BY p.id
我添加这个是为了让你更好地理解我想做什么。
您尝试过使用 OR 代替 AND 吗?
WHERE
(c.fk_product_atribute = "paper" and c.fk_product_atribute_value = "120g")
OR
(c.fk_product_atribute = "color" and c.fk_product_atribute_value = "4/0")
让 INNER JOIN
为您代劳!
SELECT price FROM product_config p
INNER JOIN config__atribute__value c1 ON p.id = c1.fk_product_config
AND c1.fk_product_atribute = 'paper'
AND c1.fk_product_atribute_value = '120g'
INNER JOIN config__atribute__value c2 ON p.id = c2.fk_product_config
AND c2.fk_product_atribute = 'color'
AND c2.fk_product_atribute_value = '4/0'
由于使用内部联接,返回的唯一产品配置将是具有这两个属性且这些属性具有所需值的配置。
这可能证明了为什么 EAV 是构建关系数据的糟糕方法。您的查询变得庞大而复杂。