繁体   English   中英

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

[英]How to use MySQL WHERE IN statement with subquery?

桌子

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语句期望的数组。

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

要直接回答您的查询:

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

另外,根据上面的错误消息,您遇到的语法错误指向第二行; 我怀疑您where...in查询中的where...in没有包含FROM swaps_products as sp

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM