为每个不同类型的列提取多个相似的行

时间:2013-09-12 19:21:38

标签: mysql sql

输入

+--------+------+------+
|  col1  | col2 | col3 |
+--------+------+------+
| apple  | d    |   10 |
| apple  | d    |   44 |
| apple  | e    |   55 |
| orange | d    |   99 |
| orange | c    |   33 |
| orange | d    |   10 |
| banana | e    |   55 |
| banana | d    |   10 |
+--------+------+------+

必需的输出

+--------+------+------+
|  col1  | col2 | col3 |
+--------+------+------+
| apple  | d    |   10 |
| orange | d    |   10 |
| banana | d    |   10 |
+--------+------+------+

我们将检查col2和col3的N种不同类型的水果。

我们只想列出那些col2和col3值相同而且所有水果都有行的那些

扩展说明:

你可以这样想: -

第1步

将所有不同类型的水果分开: -

苹果: -

+-------+------+------+
| col1  | col2 | col3 |
+-------+------+------+
| apple | d    |   10 |
| apple | d    |   44 |
| apple | e    |   55 |
+-------+------+------+

橙: -

+--------+------+------+
|  col1  | col2 | col3 |
+--------+------+------+
| orange | d    |   99 |
| orange | c    |   33 |
| orange | d    |   10 |
+--------+------+------+

香蕉: -

+--------+------+------+
|  col1  | col2 | col3 |
+--------+------+------+
| banana | e    |   55 |
| banana | d    |   10 |
+--------+------+------+

第2步: -

现在只选择那些

的行
  • 有SAME col2& col3值

  • 它存在于所有类型的水果中。

观察: -

'apple e 55'和'banana e 55'具有相同的col2和col3值,但未选中它,因为'orange e 55'不存在。

如果您使用临时表,请确保它应该是通用的。它应该支持N个水果。

注意: - 这不是学生:D的作业。我用简单的语言解释它,因为它是一个漫长而冗长的查询的一部分,我对如何解决它的问题也是如此。我一直在使用创建临时表的技术,但我遇到了一些问题。它不是通用的。所以,我相信这个问题可能有更好的解决方案。

1 个答案:

答案 0 :(得分:5)

基本上,您可以通过此查询获取所有水果中存在的记录,而不管name

SELECT  col2, col3
FROM    tableName
GROUP   BY col2, col3
HAVING  COUNT(*) = (SELECT COUNT(DISTINCT col1) FROM tableName)

一组两列中的记录总数:col2col3必须等于结果总数。 SELECT COUNT(DISTINCT col1) FROM tableName

因此,为了获得所有水果中存在组合的所有记录,我们需要JOIN表格本身。

SELECT  a.*
FROM    tableName a
        INNER JOIN
        (
            SELECT  col2, col3
            FROM    tableName
            GROUP   BY col2, col3
            HAVING  COUNT(*) = (SELECT COUNT(DISTINCT col1) FROM tableName)
        ) b ON a.col2 = b.col2 AND
                a.col3 = b.col3