帮我构建这个MySQL查询

时间:2009-08-28 06:11:22

标签: mysql

这应该很容易,但事实并非如此:(

我有一个包含许多不同功能ID的表。

我需要的是建立一种说法:

“告诉我所有有小狗,小猫,老鼠或鱼的宠物商店”(至少一个)

这很容易。

我坚持的是......

“告诉我所有宠物商店肯定有小狗,但也许还有小猫,老鼠或鱼”

有什么想法吗? :)

谢谢你们!

编辑:

我在另一个网站上发布了这个问题,但没有得到答案,我会在这里发布。这是我原来的问题,请考虑以上内容:

+ ------------------ + ---------- + --------- +

| Column1 | Column2 | Active |

+ ------------------ + ---------- + --------- +

| blue widgets | 14 | y |

| red | 14 | y |

| redx | 15 | y |

|布鲁斯| 14 | y |

| blue | 15 | n |

| bluesX | 15 | n |

|小部件| 14 | n |

+ ------------------ + ---------- + --------- +

这是我的剧情......我需要查询一下:

其中(Column2 = 14 AND Column2 = 15)和active ='y'

我的结果集包含所有记录,其中Column2 = 14和Column2 = 15

有活动='y'

我无法弄明白......

我可以这样做,所以它返回14和15,其中至少有一个为y,但不是两者。

我试过了:

从表中选择*(Column2 = 14和Column2 = 15)和active ='y'

当然,这不会返回任何内容,因为两者不能同时为14和15。

所以我试过了:

从表中选择*((Column2 = 14或Column2 = 15)和active ='y')

这会返回一个结果集,但不是我想要的结果......

我只需要在column1中返回结果:

column2 = 14 and active ='y' column2 = 15和active ='y'

两个条件都必须为真。

有任何帮助吗?多谢你们!

6 个答案:

答案 0 :(得分:2)

我也不愿意给出答案,但我会给你一些提示。

假设您感兴趣的行是这样的:

col1 col2 active
 red  14   y
 red  15   y

然后你想要的颜色是某些行有14& y,有些其他行有15&年。
当然,两行的颜色必须相等。

答案与这个原则有关:

任何SQL表达式一次只引用一行。

您可以使用JOIN将一行与另一行组合,结果是一个新行,其列数为两倍,并且在执行查询时短暂存在(即它不存储在任何位置)。由于它现在是一行,因此您可以使用write SQL表达式来比较源表中不同行上的列。

另一个对使用连接很重要的概念:表别名

这会让你继续下去吗?


好的,是的,我不情愿,因为这个问题被标记为家庭作业。但现在已不复存在了。

这就是我的意思:

SELECT DISTINCT col1
FROM mytable t1 JOIN mytable t2
 ON (t1.col1 = t2.col1)              -- i.e. they are both red
WHERE t1.col2 = 14 AND t1.active = 'y'
 AND  t2.col2 = 15 AND t2.active = 'y';

一旦进行了连接,就会在同一行的两个表中都有列(至少在形成的结果集中,而不是存储中)。因此,您可以编写一个表达式,引用基表的两行中的列。

答案 1 :(得分:1)

这很简单:

SELECT * FROM table 
WHERE (Column2 = 14 AND active = 'y') OR (Column2 = 15 AND active = 'y')

答案 2 :(得分:1)

你可以这样做:

select
    pet_store_name
from pet_store
where
    pet_type = 'puppies' or
    (pet_type in ('kittens', 'mice', 'fish'))

*编辑:请参阅Michael的回答。

答案 3 :(得分:1)

假设你的表格是

id, pet_store_name, pet_type


select distinct   
     pet_store_name
from 
     pet_store
where    
     pet_type = 'puppies' AND
     pet_store_name in (select pet_store_name from pet_store 
                        where pet_type in('kittens', 'mice', 'fish')

答案 4 :(得分:1)

抱歉,您的问题仍然定义不明确:您说要选择同时包含column2 = 14和column2 = 15的行。简单:不存在,第二列最多只有一个值(可能为null)。

由于这个问题被标记为家庭作业,我不会只是给你答案。首先,问自己一个唯一性问题:是否有多行可能有column1 ='red'和column2 ='14'?如果没有,那么您需要计算满足多少要求“column2 ='some value'”,并且只选择那个数字是满足要求的那些要求。

如果是这种情况,请尝试

SELECT
  Column1,
  SUM(Column2 IN (14, 15)) AS NumberOfRequirementsMet
FROM table
WHERE Active = 'y'
GROUP BY Column1
HAVING NumberOfRequirementsMet = 2;

答案 5 :(得分:1)

参考你的表格,你可能正在寻找类似的东西:

SELECT DISTINCT t1.col1 FROM table t1 INNER JOIN table t2 ON t1.col1 = t2.col1 AND t1.col2 = 'puppies' AND t2.col2 IN ('mice','fish','reptiles')

如果这是一个常见的查询,您可能希望对表进行非规范化并重新组织数据。