在MySql中使用IN与group_concat进行比较

时间:2016-01-13 13:57:07

标签: mysql

enter image description here并写了这个查询:

SELECT * FROM table1 WHERE ID IN (SELECT ID IN table2);
  

输出:它只选择第一行,但选择

SELECT * FROM table1 WHERE ID IN (1,2); 
  

输出:选择两行

这些是我正在使用的确切查询

mysql> show create table tmp_product_ids;
+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------+
| Table           | Create Table                                                                                                                                   |
+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------+
| tmp_product_ids | CREATE TABLE `tmp_product_ids` (
  `product__id` int(11) DEFAULT NULL,
  `order__id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from tmp_product_ids;
+-------------+-----------+
| product__id | order__id |
+-------------+-----------+
|           1 |         2 |
|           2 |         1 |
+-------------+-----------+
2 rows in set (0.01 sec)

mysql> select * from tmp_product_ids where product__id in (1,2);
+-------------+-----------+
| product__id | order__id |
+-------------+-----------+
|           1 |         2 |
|           2 |         1 |
+-------------+-----------+
2 rows in set (0.00 sec)

mysql> select group_concat(product__id) from tmp_product_ids;
+---------------------------+
| group_concat(product__id) |
+---------------------------+
| 1,2                       |
+---------------------------+
1 row in set (0.00 sec)

mysql> select * from tmp_product_ids where product__id in (select group_concat(product__id) from tmp_product_ids);
+-------------+-----------+
| product__id | order__id |
+-------------+-----------+
|           1 |         2 |
+-------------+-----------+
1 row in set (0.00 sec)

任何人都可以解释这种行为吗? 如何在不使用连接的情况下编写用于删除行delete from table1 where ID in (select ID from table2)的mysql查询? 注意: 我已经使用group_concat函数从不同的表中获取id:

4 个答案:

答案 0 :(得分:0)

你IN声明有点偏。因为你有这样的文字:

WHERE ... IN ('2,1')

查询正在查找文字字符串[' 2,1']。你需要将每个包含在刻度中:

WHERE ... IN ('2','1')

或者如果这是一个整数字段:

WHERE ... IN (2,1)

希望这有帮助。

答案 1 :(得分:0)

前两个查询的结果取决于表中的数据。你的最后两个查询只返回一个布尔值,你问

  

是1 {2,1}的组件?

结果为1(真)。如果你问

  

是{' 1,2'}?

的组成部分

它正确返回0(false)。

您收到的警告可能是因为您要将整数值与字符串进行比较。另见Wes的答案。

答案 2 :(得分:0)

  

如何编写用于删除行的mysql查询

您可以编写一个简单的连接查询,例如

.on("click", (e: NVEdge) => { console.log("toto") }) 

如果没有DELETE table1 FROM table1 INNER JOIN table2 ON table1.id = table2.id; ,您也可以使用子查询

JOIN

你也可以使用delete from table1 where ID in (select distinct ID from table2); 之类的

WHERE EXISTS

同样,您的第一个查询delete from table1 t1 where exists (select 1 from table2 where id = t1.id); 会返回1行,因此最有可能select * from table1 where ID in (select ID in table2);只有1条记录。

执行table2验证相同。

答案 3 :(得分:0)

所以这是一个快速解释。

所以你说DELETE FROM Table_1 WHERE ID IN (SubQuery);

将在subquery中选择WHATver,并且ID中与ID相同的Table_1将被删除。

在删除之前,您可以单独执行subquery。并且您将了解选择了多少行以及与Table_1匹配的行数。

您还可以在WHERE中添加subquery条件。

DELETE FROM Table_1 WHERE ID IN (SELECT ID From Table_2 WHERE Name = 'John');

如果您正在撰写IN条款,那么strings

就是这样

WHERE ID IN ('1','2','3');

OR

如果是INT

WHERE ID IN (1,2,3);