【问题标题】:Checking Multiple Column Value检查多列值
【发布时间】:2012-04-09 04:01:49
【问题描述】:

我正在尝试获取某些多个 col2 值的 col1 值。例如:我想查看 col2 的“1、2、3、4”值(即 col1 中的“1”)的 col1 值。另一个例子:col2 的 "1, 2" 的 col1 值为 "1, 2"。我怎样才能在 SQL 语法中做到这一点?

【问题讨论】:

  • 这似乎是一个非常基本的问题(无意冒犯)。您能否确认您只想获取 col1 的值,其中 col2 的值为1,2,3, or 4?或者你的意思是你想要最低的价值?或者是其他东西?因为在您的第一个示例中,col1 值将是 1 或 2,因为 col2 在 col1 中的 1 和 2 旁边有 1 和 2。
  • 我只想获取 col1 的值,该值恰好具有“1,2,3,4”作为 col2。在这种情况下,它在 col1 中为“1”。但我得到“1,2”和“SELECT DISTINCT col1 FROM MyTable WHERE col2 IN ('1', '2', '3', '4')”语句。
  • col2 的值“1,2”,那么 col1 应该是“2”吗?还是“1,2”?
  • @xdazz 那么应该是“1,2”

标签: mysql sql-match-all


【解决方案1】:

你想要的是relational division。有几种方法可以实现它。检查这个问题,它有十多个不同的解决方案来解决类似问题 - 包括基准:How to filter SQL results in a has-many-through relation

这是其中一种方式(假设(col1, col2) 组合是唯一的):

SELECT col1 
FROM tableX 
WHERE col2 IN (1, 2, 3, 4)
GROUP BY col1
HAVING COUNT(*) = 4            --- the size of the above list

还有一个:

SELECT t1.col1 
FROM tableX AS t1
  JOIN
     tableX AS t2
         ON  t2.col1 = t1.col1
         AND t2.col2 = 2
  JOIN
     tableX AS t3
         ON  t3.col1 = t1.col1
         AND t3.col2 = 3
  JOIN
     tableX AS t4
         ON  t4.col1 = t1.col1
         AND t4.col2 = 4
WHERE t1.col2 = 1

【讨论】:

    【解决方案2】:

    这可能会有所帮助:

    SELECT col1 FROM MyTable WHERE col2 IN ('1', '2', '3', '4')
    

    这将返回 col2 为“1”、“2”、“3”或“4”的所有行。

    即在您的示例中,上述查询将返回

    col1
    ---------
    1
    1
    1
    1
    2
    2
    

    如果添加DISTINCT clause,则只会得到不同的 col1 值:

    SELECT DISTINCT col1 FROM MyTable WHERE col2 IN ('1', '2', '3', '4')
    

    会回来

    col1
    ---------
    1
    2
    

    在你的例子中。

    【讨论】:

    • 我只想要与这些多个 col2 值匹配的 col1 值。例如:该语句应该只返回 col1 的“1”
    • @gcx 我想我还没有完全理解你的问题。
    • @gcx 你的意思是如果 col2 是 1、2、3 或 4,你只希望查询返回 col1 中出现最多的值?还是只想要多次出现的值?我认为你需要给出一个用例/真实世界的例子
    • @UweKeim 很抱歉无法解释清楚,让我详细说明一下。我想显示 col2 中“必须”具有“1,2,3,4”的 col1 值。在示例中,col1 的“1”值具有“1,2,3,4”,col1 的“1”值在其 col2 中只有“1,2”,因此使用此语句,我应该只看到 col1 的“1”值作为结果.但是,它也给出了 col1 的“2”值。
    • @gcx 谢谢,我调整了示例。
    【解决方案3】:

    你不能用 SQL 做你解释的事情。从您的评论来看:

    我想显示 col2 中“必须”具有“1,2,3,4”的 col1 值。在示例中,col1 的“1”值具有“1,2,3,4”,col1 的“1”值在其 col2 中只有“1,2”,因此使用此语句,我应该只看到 col1 的“1”值作为结果.但是,它也给出了 col1 的“2”值

    我认为顺序很重要。由于每一行在数据集中的位置并不是唯一的,因此不能简单地使用 SQL 来完成。您必须使用某种编程语言(C、java、php...任何您喜欢的语言)加载您的数据集,然后循环遍历您的数据集并以这种方式检查这些序列。

    【讨论】:

    • 如果这就是您所要求的,则与序列无关。可以是 "1,3,2,4" 或 "4,3,1,2" 没关系。不幸的是,Uwe Keim 的回答结果是“1,2”。我希望它显示“1”作为结果。
    猜你喜欢
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    相关资源
    最近更新 更多