Mysql 从一个表中选择行,其中另一个表中的多行具有确定的值
我在MySQL中有两个表:Mysql 从一个表中选择行,其中另一个表中的多行具有确定的值,mysql,sql,Mysql,Sql,我在MySQL中有两个表: 产品: id | value ================ 1 | foo 2 | bar 3 | foobar 4 | barbar 及物业: product_id | property_id ============================= 1 | 10 1 | 11 2 |
产品:
id | value
================
1 | foo
2 | bar
3 | foobar
4 | barbar
及物业:
product_id | property_id
=============================
1 | 10
1 | 11
2 | 15
2 | 16
3 | 10
3 | 11
4 | 10
4 | 16
我想得到具有确定特性的产品。
例如,我需要获取所有具有ID为10和11的属性的产品。我希望产品的ID是1和3,但不是4
这在mysql中是可能的还是我需要使用PHP
谢谢大家! 试试这个:
SELECT p.id
FROM product p
INNER JOIN properties prop
ON p.id = prop.product_id
AND property_id IN ( 10, 11 )
GROUP BY p.id
HAVING Count(DISTINCT property_id) = 2
试试这个:
SELECT p.id
FROM product p
INNER JOIN properties prop
ON p.id = prop.product_id
AND property_id IN ( 10, 11 )
GROUP BY p.id
HAVING Count(DISTINCT property_id) = 2
ID为10和11
以下是两种解决方案:
SELECT p.id,
p.value,
Count(DISTINCT propety_id)
FROM products p
INNER JOIN properties pr
ON p.id = pr.product_id
AND propety_id IN ( 10, 11 )
HAVING Count(DISTINCT propety_id) = 2;
或者
SELECT p.id,
p.value
FROM products p
INNER JOIN properties pr1
ON p.id = pr2.product_id
AND pr1.propety_id = 10
INNER JOIN properties pr2
ON p.id = pr2.product_id
AND pr2.propety_id = 11;
至于排除行,请添加NOT exists子句,或者执行额外的左连接并排除匹配的行
SELECT *
FROM [products]
WHERE id IN (SELECT product_id
FROM [properties]
WHERE propety_id IN ( '10', '11' )
HAVING Count(DISTINCT propety_id) = 2);
ID为10和11
以下是两种解决方案:
SELECT p.id,
p.value,
Count(DISTINCT propety_id)
FROM products p
INNER JOIN properties pr
ON p.id = pr.product_id
AND propety_id IN ( 10, 11 )
HAVING Count(DISTINCT propety_id) = 2;
或者
SELECT p.id,
p.value
FROM products p
INNER JOIN properties pr1
ON p.id = pr2.product_id
AND pr1.propety_id = 10
INNER JOIN properties pr2
ON p.id = pr2.product_id
AND pr2.propety_id = 11;
至于排除行,请添加NOT exists子句,或者执行额外的左连接并排除匹配行。以下是我解决该问题的方法:
SELECT *
FROM [products]
WHERE id IN (SELECT product_id
FROM [properties]
WHERE propety_id IN ( '10', '11' )
HAVING Count(DISTINCT propety_id) = 2);
mysql> SELECT * FROM products;
+----+--------+
| id | value |
+----+--------+
| 1 | foo |
| 2 | bar |
| 3 | foobar |
| 4 | barbar |
+----+--------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM properties;
+------------+-------------+
| product_id | property_id |
+------------+-------------+
| 1 | 10 |
| 1 | 11 |
| 2 | 15 |
| 2 | 16 |
| 3 | 10 |
| 3 | 11 |
| 4 | 10 |
| 4 | 16 |
+------------+-------------+
8 rows in set (0.00 sec)
现在,我们选择所有产品标识,它们在(10,11)中有属性标识,并且属性标识有两个不同的行:
mysql> SELECT
product_id FROM properties
WHERE
properties.property_id IN (10, 11)
GROUP BY
product_id
HAVING
COUNT(DISTINCT property_id) = 2;
+------------+
| product_id |
+------------+
| 1 |
| 3 |
+------------+
2 rows in set (0.01 sec)
将此查询与从产品中选择相结合:
mysql> SELECT
id, value
FROM
products
WHERE
products.id IN(
SELECT
product_id FROM properties
WHERE
properties.property_id IN (10, 11)
GROUP BY
product_id
HAVING
COUNT(DISTINCT property_id) = 2);
+----+--------+
| id | value |
+----+--------+
| 1 | foo |
| 3 | foobar |
+----+--------+
2 rows in set (0.00 sec)
以下是我如何解决的:
mysql> SELECT * FROM products;
+----+--------+
| id | value |
+----+--------+
| 1 | foo |
| 2 | bar |
| 3 | foobar |
| 4 | barbar |
+----+--------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM properties;
+------------+-------------+
| product_id | property_id |
+------------+-------------+
| 1 | 10 |
| 1 | 11 |
| 2 | 15 |
| 2 | 16 |
| 3 | 10 |
| 3 | 11 |
| 4 | 10 |
| 4 | 16 |
+------------+-------------+
8 rows in set (0.00 sec)
现在,我们选择所有产品标识,它们在(10,11)中有属性标识,并且属性标识有两个不同的行:
mysql> SELECT
product_id FROM properties
WHERE
properties.property_id IN (10, 11)
GROUP BY
product_id
HAVING
COUNT(DISTINCT property_id) = 2;
+------------+
| product_id |
+------------+
| 1 |
| 3 |
+------------+
2 rows in set (0.01 sec)
将此查询与从产品中选择相结合:
mysql> SELECT
id, value
FROM
products
WHERE
products.id IN(
SELECT
product_id FROM properties
WHERE
properties.property_id IN (10, 11)
GROUP BY
product_id
HAVING
COUNT(DISTINCT property_id) = 2);
+----+--------+
| id | value |
+----+--------+
| 1 | foo |
| 3 | foobar |
+----+--------+
2 rows in set (0.00 sec)
试试这个
SELECT Prd.*
FROM products As Prd
LEFT JOIN (SELECT product_id ,SUM(RStatus) As Tt
FROM (SELECT product_id,
CASE
WHEN propety_id = 10 THEN NULL
WHEN propety_id = 11 THEN NULL
ELSE 0
END As RStatus
FROM properties
) A
GROUP BY product_id
) AS Prt ON(Prd.ID = Prt.product_id )
WHERE Prt.Tt IS NULL
试试这个
SELECT Prd.*
FROM products As Prd
LEFT JOIN (SELECT product_id ,SUM(RStatus) As Tt
FROM (SELECT product_id,
CASE
WHEN propety_id = 10 THEN NULL
WHEN propety_id = 11 THEN NULL
ELSE 0
END As RStatus
FROM properties
) A
GROUP BY product_id
) AS Prt ON(Prd.ID = Prt.product_id )
WHERE Prt.Tt IS NULL
是的,我相信这在MySQL中是可能的。您不必使用PHP解决方案。
select*from properties where property\u id in('10','11')
在您的情况下,您可能希望使用参数输入属性以防止注入。为什么选择“property\u id”而不是“property\u id”?是的,我相信在MySQL中是可能的。您不必使用PHP解决方案。select*from properties where property\u id in('10','11')
在您的情况下,您可能希望使用参数输入属性以防止注入。为什么是“property\u id”而不是“property\u id”?“HAVING SUM(property\u id)=2”-但是10+11=21?@symcbean是的,可以计数。如果计数不明显,你可以用(10,10)或(11,11)来获得id。我想如果你特别受虐,你可以尝试使用Golomb标尺的变体来解决这个问题。@symcbean你能试试吗?你让我好奇。“HAVING SUM(property_id)=2”-但是10+11=21?@symcbean是的,可以计数。如果计数不明显,你可以用(10,10)或(11,11)获得id。我想,如果你特别受虐,你可以尝试使用Golomb标尺的变体来解决这个问题。@symcbean你能试试吗?你让我好奇。谢谢你的详细回答,但这个解决方案非常缓慢。在我的数据库中,它的工作时间为0.2569秒faster@wshakura我不知道,因为我在一个小数据集上测试,它给了我0秒。当然,最好的解决方案必须勾选。谢谢您的详细回答,但是这个解决方案非常慢。在我的数据库中,它的工作时间为0.2569秒faster@wshakura我不知道,因为我在一个小数据集上测试,它给了我0秒。当然,最好的解决方案必须勾选。