根据另一列的字段值选择具有相同列值的行

Posted

技术标签:

【中文标题】根据另一列的字段值选择具有相同列值的行【英文标题】:Select rows that have the same column value based on another column's field values 【发布时间】:2017-08-25 15:41:25 【问题描述】:

在我的表中,我有 3 列带有 SubmissionId, FieldName, FieldValue。 我有一个问题:

SELECT SubmissionId, FieldName, FieldValue 
FROM myTable 
WHERE (FieldValue = "Soccer") 
  OR (FieldValue = "Main Hall") 
  OR (FieldValue = "August 23, 2017")

返回给我以下信息:

提交 ID |字段名 |字段值

     1508        | ClassLocation |  Main Hall
     1509        | EventName     |  Soccer
     1512        | EventName     |  Soccer
     1516        | ClassLocation |  Main Hall
     1520        | EventName     |  Soccer
     1520        | EventDate     |  August 23, 2017
     1520        | ClassLocation |  Main Hall
     1523        | EventName     |  Soccer
     1524        | EventName     |  Soccer
     1525        | ClassLocation |  Main Hall
     1538        | EventName     |  Soccer
     1539        | EventName     |  Soccer
     1539        | EventDate     |  August 23, 2017
     1539        | ClassLocation |  Main Hall
     1540        | ClassLocation |  Main Hall
     1550        | ClassLocation |  Main Hall

我现在正在尝试找出添加到此查询的最佳方法,以便我只能从重复三次的 SubmissionId 列中获取字段值,在这种情况下,提交 ID 为 1520 和 1539 .

【问题讨论】:

见:Why should I provide an MCVE for what seems to me to be a very simple SQL query? 不相关提示:像这样使用IN FieldValue IN ('Soccer', 'Main Hall', 'August 23, 2017') 如果有人想玩'Pool',或者事件发生在'Pool'中怎么办? @Strawberry EventName 的字段值比方说是固定的,但是同一个事件“足球”,也可以在另一个 ClassLocation 或 EventDate 中播放,那么它们将具有不同的 SubmissionId。我只对 EventName/EventDate/ClassLocation 的 SubmissionId 相同的结果感兴趣... @MarcinRachwal 在这种情况下,您搜索值而不是键似乎很奇怪!?! 【参考方案1】:

试试:

SELECT SubmissionId, COUNT(SubmissionId) 
FROM YourTable 
GROUP BY SubmissionId 
HAVING COUNT(SubmissionId) = 3

【讨论】:

要格式化为code,选择文本并按ctrl-k或在每行前添加4个空格【参考方案2】:
SELECT SubmissionId
FROM myTable 
WHERE FieldValue in ('Soccer','Main Hall', 'August 23, 2017')
GROUP BY SubmissionID
HAVING count(Distinct fieldName) = 3 

我使用一个不同的字段值可以重复给定的提交ID。

您还可以绑定 FieldName 以确保配对映射

WHERE (FieldName, FieldValue) in (('EventName','Soccer'),('ClassLocation','Main Hall'),('EventDate','August 23, 2017'))

【讨论】:

这也很好用!我也喜欢为配对映射添加到 FieldName 的领带,非常有用!【参考方案3】:

只需将当前查询用作聚合的子查询

SELECT SubmissionId
FROM ( SELECT SubmissionId, FieldName, FieldValue 
       FROM myTable 
       WHERE FieldValue IN ( "Soccer", "Main Hall", "August 23, 2017")
     ) as T
GROUP BY SubmissionId
HAVING COUNT(*) = 3

【讨论】:

这很好用!现在看很简单,非常感谢你帮我解决这个问题。

以上是关于根据另一列的字段值选择具有相同列值的行的主要内容,如果未能解决你的问题,请参考以下文章

mysql如何根据一列值更新另一列的值?

SQL如何查询出某一列中不同值出现的次数?

Laravel - 查询构建器以选择具有唯一列值的多行(具有另一列的最大值)

连接具有相同值的行的列值(不同列的)

根据值是不是是另一列的子字符串来更新列值

根据另一列值更新数据框的列