如何在子查询中使用MySQL WHERE IN语句?

时间:2017-01-12 15:57:02

标签: mysql

表格

mysql> SELECT * FROM swaps_products;

+----+---------+-----------+------------+-----------+---------------------+
| id | swap_id | holder_id | swap_to_id | product_id| added               |
+----+---------+-----------+------------+-----------+---------------------+
|  1 |       9 |         3 |          0 |        32 | 2017-01-06 10:43:52 |
|  2 |      11 |        13 |          0 |         3 | 2017-01-06 11:03:45 |
|  3 |      11 |        13 |          0 |         4 | 2017-01-06 11:03:45 |
|  4 |      11 |         3 |          0 |        32 | 2017-01-06 11:03:45 |
|  5 |      11 |         3 |          0 |        31 | 2017-01-06 11:03:45 |
|  6 |      11 |         3 |          0 |        30 | 2017-01-06 11:03:45 |
|  7 |      12 |         3 |          0 |        32 | 2017-01-06 14:16:13 |
|  8 |      12 |         3 |          0 |        31 | 2017-01-06 14:16:13 |
|  9 |      12 |         2 |          0 |         2 | 2017-01-06 14:16:13 |
| 10 |      12 |         2 |          0 |         1 | 2017-01-06 14:16:13 |
| 11 |      13 |        13 |          3 |         3 | 2017-01-12 14:31:44 |
| 12 |      13 |        13 |          3 |         4 | 2017-01-12 14:31:44 |
| 13 |      13 |         3 |         13 |        32 | 2017-01-12 14:31:44 |
| 14 |      13 |         3 |         13 |        31 | 2017-01-12 14:31:44 |

swap_id = 13涉及四种产品 - 3,4,31,32。我需要查询,这将给我所有其他交换(swap_id列表),其中有3,4,31,32个产品涉及。

我有这个

SELECT sp.swap_id as swap_id, sp.holder_id as holder_id
    -> FROM swaps_products as sp
    -> JOIN swaps as s
    -> ON s.id=sp.swap_id
    -> WHERE (sp.swap_id != 13) AND
    -> (s.rejected IS NULL) AND
    -> ((s.swapped IS NULL) OR (s.swapped2 IS NULL)) AND
    -> (sp.product_id IN (3,4,31,32));

JOIN对问题并不重要。这个查询有效,但问题是我只知道swap_id。所以我尝试了这个:

(sp.product_id IN (SELECT product_id FROM swaps_products WHERE swap_id = 13));

但得到了错误:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'JOIN swaps as s
ON s.id=sp.swap_id
WHERE (sp.swap_id != 13) AND
(s.rejected IS N' at line 2

我认为问题是子查询不返回IN语句中预期的数组。

2 个答案:

答案 0 :(得分:0)

IN语句要求结果是要检查的值的单列向量。

直接回答您的问题:

select * from swaps_products where product_id in (SELECT product_id FROM swaps_products where swap_id = 13) and swap_id != 13

此外,根据上面的错误消息,您遇到的语法错误指向第2行;我怀疑您在FROM swaps_products as sp查询中遗漏了where...in部分。

答案 1 :(得分:0)

SELECT DISTINCT y.* 
           FROM swaps_products x 
           JOIN swaps_products y 
             ON y.product_id = x.product_id 
            AND y.swap_id <> 13 
          WHERE x.swap_id = 13;