【问题标题】:how to combine multiple true/false rows in MYSQL如何在MYSQL中组合多个真/假行
【发布时间】:2011-05-12 15:36:41
【问题描述】:

我有一个包含各种真/假列的表的连接查询。 我可以强制执行 DISTINCT 和 GROUP BY 以确保只返回单个唯一行,但是真/假行的行为无法预测,例如:

**Table 1**
loc_id name
-------------
1      a
2      b
3      c
4      d

**Table 2**
prod_id loc_id value
-------------
1       1      abc
2       1      bcd
3       1      def
4       2      fgh

**Table 3**
prod_id flag
-------------
1       0
2       0
3       1
4       1

SELECT DISTINCT name, flag from table1
LEFT JOIN table3 ON table3.prod_id = table2.prod_id
LEFT JOIN table2.loc_id=table1.loc_id

这给了我包含 loc 名称列表的行。但是标志列有时会返回多行,我想做的是组合这些行,以便如果有多个行,并且它们同时包含 0 和 1,则查询将只返回标志设置为 1 的一行。如果有多个行包含 0,它将为该行返回 0... 我尝试使用 GROUP BY 名称,它返回唯一的行,但是我注意到对于在标志列中设置了 0 和 1 的重复行,它将返回 0?

任何帮助表示赞赏

【问题讨论】:

  • 因此,位置可以有多个产品,每个产品的标志设置为 1 或 0。prod_table 已经很大,必须将数据分离到另一个表中。即使它在同一个表中,同样的问题也适用 - 当我使用 GROUP BY 名称时,我希望那些返回 0 和 1 的多行在行中返回 1...有人可以发布示例查询吗?
  • 0 多于 1 时是否返回 0,1 多于 0 时返回 1?还是如果集合中有 1,则返回 1,否则返回 0?
  • 只要这多行中只有一个1,就应该返回1。

标签: mysql group-by distinct-values


【解决方案1】:

当有 1 时你想要 1,如果没有,你想要 0,一个 MAX(flag) 就足够了。

SELECT name, MAX(flag) from table1
LEFT JOIN table3 ON table3.prod_id = table2.prod_id
LEFT JOIN table2.loc_id=table1.loc_id
GROUP BY name

【讨论】:

  • 没问题。对看似布尔变量使用数学运算通常并不明显。但是由于 TRUE/FALSE 在 MySQL 中存储为 1/0,所以它是一个方便的功能。
  • 这让我感到困惑。我在想布尔值。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多