mysql - SQL "GROUP BY"和 "INNER JOIN"语句一起

标签 mysql sql

我有两个 ANIMAL 和 NEED 表:

        ANIMAL                                      NEED        
Name    Species         Birthday                A_Species      Type 
Koala1  Phascolarctidae 02-10-2014           Phascolarctidae    Veg.    
Bear1   Ursinae         03-10-2016           Ursinae            Veg.    
Koala2  Phascolarctidae 04-09-2015           Ursinae            Meet    
Cattle1 Bovidae         20.03.2017           Ursinae            Fish    
Whale1  Cetacea         08.05.2010           Bovidae            Veg.    
                                             Cetacea            Fish    

我要选择下表

    Name    Type                
    Koala1  Veg.                
    Koala2  Veg.                
    Cattle1 Veg.                
    Whale1  Fish                

这是只需要一种食物的动物名称及其食物的列表!

我必须合并两个声明

SELECT A_Species 
FROM NEED GROUP BY A_Species
HAVING COUNT(A_Species)=1;

SELECT ANIMAL.NAME, NEED.Type 
FROM ANIMAL 
INNER JOIN NEED ON ANIMAL.Species = NEED.A_Species;                 

我试过了

SELECT ANIMAL.NAME, NEED.Type 
FROM ANIMAL 
INNER JOIN NEED ON ANIMAL.Species = NEED.A_Species 
WHERE EXISTS(SELECT A_Species 
FROM NEED GROUP BY A_Species
HAVING COUNT(A_Species)=1); 

这是行不通的! 你能帮我把它们放在一起吗?

最佳答案

一种方法使用聚合:

SELECT a.NAME, MAX(n.Type)
FROM ANIMAL a INNER JOIN
     NEED n
     ON a.SPECIES = n.A_SPECIES 
GROUP BY a.Name
HAVING COUNT(*) = 1;

或者另一种方法是使用 NOT EXISTS:

SELECT a.NAME, n.Type
FROM ANIMAL a INNER JOIN
     NEED n
     ON a.SPECIES = n.A_SPECIES 
WHERE NOT EXISTS (SELECT 1
                  FROM need n2
                  WHERE n2.A_SPECIES = n.A_SPECIES AND
                        n2.Type <> n.Type
                 );

在实践中,这可能有更好的性能,特别是在 need(a_species, type) 上的索引。

关于mysql - SQL "GROUP BY"和 "INNER JOIN"语句一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50668919/

相关文章:

php - 有没有办法用子句 "inner join,"连接两个表,然后是多个 "left join"子句

php - 如何在codeigniter中插入除id之外的唯一表数据?

mysql - 从多个表中选择列时,如何从同一列中的 2 个条件返回数据?

php - 如何在 MySQL 和 PHP 中找到相同的表?

mysql - 选择查询与 cte 的联合

sql - MySQL:在 CREATE TABLE 语句中命名主键

php - 使用sql按家庭搜索表

sql - 添加 number + varchar 以获得字符串连接

php - 按作者列出类别 ~ WITH COUNTER ~ (Wordpress)

sql - Oracle Apex 5 : Using Multiple Columns in a Bar Charts Axix