Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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 从一个表中选择行,其中另一个表中的多行具有确定的值_Mysql_Sql - Fatal编程技术网

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 |

我在MySQL中有两个表:
产品:

  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秒。当然,最好的解决方案必须勾选。