簡體   English   中英

從一個表中選擇行,其中另一表中的多行已確定值

[英]Select row from one table where multiple rows in another table have determined values

我在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?

謝謝!

ID為10和11

這是2個解決方案:

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 NOT子句,或進行額外的左連接並排除匹配的行。

SELECT * 
FROM   [products] 
WHERE  id IN (SELECT product_id 
              FROM   [properties] 
              WHERE  propety_id IN ( '10', '11' ) 
              HAVING Count(DISTINCT propety_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 

這是我解決的方法:

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)

現在,我們選擇所有具有property_ids IN(10,11)並具有2個不同的property_id行的產品ID:

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)

將此查詢與產品的SELECT-ing結合使用:

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)

sql小提琴

試試這個

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM