MySQL - 仅选择那些没有其他值的那些

时间:2014-09-26 08:28:20

标签: mysql select where

我需要一个查询来选择所有这些没有重复另一个值的条目。我将在下一行解释这个案例。

情况

我有一张物品和价值表。每个项目都可以使用不同的值重复。让我们说我在表B中有以下记录集:

 item_id    value    type_value

ID Item A     0          0
ID Item B     0          0
ID Item A     1          0
ID Item C     1          1

这些项目,正如您已经猜到的那样,是ID,因此"原始"包含其信息的项目位于另一个表格中。我想要做的是从"原始"中选择。列出我在第二个表格中解释过的那些项目。

我需要什么

正如我之前介绍的那样,我需要从表A中选择所有那些ID在表B中的项目,但只有那些值设置为0并且没有其他记录被设置为1且具有相同类型的& #34; type_value&#34 ;.

由于"原创" table,我需要在带有INNER SELECT的WHERE子句中这样做。在这种情况下,输出的结果将是:

 item_id    value    type_value

ID Item B     0          0
ID Item C     1          1

如果我们决定只选择具有指定type_value的那些,我知道如何做到这一点,所以不要担心。

问题

我能够这样做,至少差不多。当我有相同的item_id和不同的值字段时,我的问题出现了,所以当我试图说" WHERE值!= 1"时,这仍然被选中,因为还有另一个值为0的记录。

问题

如何在主查询的WHERE子句中的内部选择中选择我喜欢的行,而不必使用NOT IN重复整个SELECT并添加" WHERE值= 1"排除那些有价值的人?

因为它可能是一个冗长而复杂的查询(主要问题),所以我希望尽可能简单。当然,正如我之前所说的,我可以复制整个查询并选择那些值设置为我不想要的那个,然后放入一个" AND NOT IN"在SELECT之前。但那重复的代码,我认为性能可能会受到影响。

感谢你们所有人的时间!

如果您需要进一步说明,请告诉我们!

修改

表-A

+----+--------+
| id | name   |
+----+--------+
| 1  | Item A |
+----+--------+
| 2  | Item B |
+----+--------+
| 3  | Item C |
+----+--------+

表-B

+---------+-------+
| item_id | value |
+---------+-------+
| 1       | 0     |
+---------+-------+
| 2       | 0     |
+---------+-------+
| 1       | 1     |
+---------+-------+
| 3       | 1     |
+---------+-------+

示例查询

SELECT name 
FROM Table_A
WHERE id IN (SELECT item_id 
      FROM Table_B
      WHERE "item_value is equal to 0 and no other row has this item_id with a item_value different from 0")

结果查询

+---------+
|   name  |
+---------+
|  Item B |
+---------+

2 个答案:

答案 0 :(得分:1)

您可以使用GROUP BYHAVING来完成此操作,例如:

SELECT a.*, b.itemid, SUM(b.value) AS vc FROM tableb b
INNER JOIN tablea a ON a.itemid = b.itemid
GROUP BY b.item_id
HAVING vc = 0

答案 1 :(得分:0)

我使用非常简单的查询结构让您了解解决方案。 可能有更好的查询来完成这项工作。

这里是:

首先,您需要获取您不希望出现的行:

这是如何完成的:

SELECT item_id,COUNT(item_id) how_many FROM my_table GROUP BY item_id HAVING (how_many>1)

现在您需要从表中选择item_id未出现在上述查询中的行,它是这样完成的:

SELECT T1.item_id,T1.value,T1.type_value
FROM my_table T1 
WHERE (T1.item_id not in (SELECT T.item_id from (SELECT item_id,COUNT(item_id) how_many FROM my_table GROUP BY item_id HAVING (how_many>1))T ))

你可以看到我使用了"而不是"运算符和我命名前一个结果表 - T

确保您了解上述内容 询问您是否需要更多信息