Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从两个表中选择不同栏中的foo_Mysql_Sql - Fatal编程技术网

Mysql 从两个表中选择不同栏中的foo

Mysql 从两个表中选择不同栏中的foo,mysql,sql,Mysql,Sql,假设我有两张桌子: Table foo =========== id | val -------- 01 | 'a' 02 | 'b' 03 | 'c' 04 | 'a' 05 | 'b' Table bar ============ id | class ------------- 01 | 'classH' 02 | 'classI' 03 | 'classJ' 04 | 'classK' 05 | 'classI' 我想返回foo和bar的所有值,其中foo存在于多个不同的bar中。因

假设我有两张桌子:

Table foo
===========
id | val
--------
01 | 'a'
02 | 'b'
03 | 'c'
04 | 'a'
05 | 'b'

Table bar
============
id | class
-------------
01 | 'classH'
02 | 'classI'
03 | 'classJ'
04 | 'classK'
05 | 'classI'
我想返回foo和bar的所有值,其中foo存在于多个不同的bar中。因此,在本例中,我们将返回:

val | class
-------------
'a' | 'classH'
'a' | 'classK'
因为尽管“b”也存在多次,但它具有相同的条形值

我有以下查询,返回有多个条的所有foo,即使条是相同的:

select distinct foo.val, bar.class
from foo, bar
where foo.id = bar.id
and
(
    select count(*) from
    foo2, bar2
    where foo2.id = bar2.id
    and foo2.val = foo.val
) > 1
order by 
va.name;

您只需使用一个已复制的子查询来显示每一行

SELECT f.val, b.class 
FROM foo f
JOIN bar b ON b.id = f.id
WHERE EXISTS
(   SELECT 1
    FROM foo 
    JOIN bar ON foo.id = bar.id
    WHERE foo.val = f.val
    GROUP BY foo.val
    HAVING COUNT(DISTINCT bar.class) > 1
);


通常存在的执行速度比中快,这就是为什么我更喜欢它而不是中。。。有关IN-VS-EXISTS的更多详细信息,请参见

您只需使用一个已复制的子查询,即可使用EXISTS这样显示每一行

SELECT f.val, b.class 
FROM foo f
JOIN bar b ON b.id = f.id
WHERE EXISTS
(   SELECT 1
    FROM foo 
    JOIN bar ON foo.id = bar.id
    WHERE foo.val = f.val
    GROUP BY foo.val
    HAVING COUNT(DISTINCT bar.class) > 1
);


通常存在的执行速度比中快,这就是为什么我更喜欢它而不是中。。。有关IN-VS的更多详细信息,请参见您可以执行子查询,从
foo
获取满足条件(名称)的总体。然后连接回两个表,以获取输出所需的信息:

select f.val, b.class
from (select f.val
      from foo f join
           bar b
           on f.id = b.id
      group by f.val
      having count(distinct b.class) > 1
     ) bf join
     foo f
     on bf.val = f.val join
     bar b
     on f.id = b.id

您可以执行子查询,从满足条件(名称)的
foo
中获取填充。然后连接回两个表,以获取输出所需的信息:

select f.val, b.class
from (select f.val
      from foo f join
           bar b
           on f.id = b.id
      group by f.val
      having count(distinct b.class) > 1
     ) bf join
     foo f
     on bf.val = f.val join
     bar b
     on f.id = b.id

很好的查询+1从我:)简单,我需要什么。顺便说一句,我正在学习sql课程,我们的老师可以生成查询,但它们通常有3或4个子查询,并且有很多多余的内容……您是否使用了编写查询的好材料?@讽刺辞抱歉,没有任何建议。我通常在网上搜索(并且经常在这里结束)@ironicaldiction说实话,这取决于你想做什么。。。我建议你试着去理解老师的疑问,因为有时候他们需要3-4级的深度。。。如果您有任何问题,请随时发布问题,您甚至可以在其中标记我们中的一位,如果可能,我们将提供帮助:)谢谢Fuzzy和John!很好的查询+1从我:)简单,我需要什么。顺便说一句,我正在学习sql课程,我们的老师可以生成查询,但它们通常有3或4个子查询,并且有很多多余的内容……您是否使用了编写查询的好材料?@讽刺辞抱歉,没有任何建议。我通常在网上搜索(并且经常在这里结束)@ironicaldiction说实话,这取决于你想做什么。。。我建议你试着去理解老师的疑问,因为有时候他们需要3-4级的深度。。。如果您有任何问题,请随时发布问题,您甚至可以在其中标记我们中的一位,如果可能,我们将提供帮助:)谢谢Fuzzy和John!