2016-08-11 54 views
0

我试图编写一个查询来获取单行中具有值等于TRUE的几个列的记录。我认为这很容易,但它变成了。MySQL - 如何从具有多个列的表格中获得一行真或假

拥有一个像这样的表:

ITEMS COL1 COL2 COL3 COL4 COL5 COL6 
---------------------------------------------------- 
ITEM1 TRUE FALSE FALSE FALSE FALSE FALSE 
ITEM1 FALSE FALSE TRUE FALSE FALSE FALSE 
ITEM1 FALSE FALSE FALSE FALSE FALSE FALSE 
ITEM1 FALSE FALSE FALSE FALSE FALSE TRUE 
ITEM2 FALSE TRUE FALSE FALSE FALSE FALSE 
ITEM2 TRUE FALSE FALSE FALSE FALSE FALSE 
ITEM2 FALSE FALSE FALSE TRUE FALSE FALSE 

我需要这样的:

ITEMS COL1 COL2 COL3 COL4 COL5 COL6 
---------------------------------------------------- 
ITEM1 TRUE FALSE TRUE FALSE FALSE TRUE 
ITEM2 TRUE TRUE FALSE TRUE FALSE FALSE 

我想在一个表中使用distinctgroup用,像这样:

Select distinct ITEMS, COL1,COL2,COL3,COL4,COL5,COL6 
FROM TABLE 
WHERE (COL10=’TRUE’ or COL2=’TRUE’ or COL3=’TRUE’ or COL4=’TRUE’ or COL5=’TRUE’ or COL6=’TRUE’) 
GROUP BY ITEMS 

但它并没有工作,我也试图加入到同一个表,但结果相同,它在TRUE列中显示FALSE。

那么,有人可以提供一个关于如何获得所需结果的提示吗? 在此先感谢。

+1

什么是你希望得到,记录,其中至少1列是'真'? –

+0

如果按ITEMS分组,则如果ITEMS值相同,则最后一行将覆盖之前的任何记录。尝试删除“GROUP BY ITEMS” – SIDU

+0

谢谢,但是如果我删除了GROUP BY ITEMS,那么我将为同一项目获取多行,并且我需要为每个ITEM使用一行,TRUE值为 –

回答

1

MySQL没有布尔值的聚合函数。然而,这些真的是0(假)和1(真)是伪装。所以,尽量max()

select items, max(col1), max(col2), max(col3), max(col4), max(col5), max(col6) 
from t 
group by items; 

如果这些被存储为字符串,然后 - 巧合 - 以上实际工作,因为'TRUE'>'FALSE'。你能更有条理:

select items, 
     (case when max(col1 = 'TRUE') > 0 then 'TRUE' else 'FALSE' end) as col1, 
     . . . 
from t 
group by items; 
+0

+1,值得'0 = false'和'1 = true'是MySQL-ism。在标准SQL和大多数其他数据库中不受支持。 –

+0

看起来他实际上是在他的表格中存储字符串,而不是布尔值。 – Barmar

+0

感谢您的建议,这完美地工作,也感谢@Bill Karwin关于此的注意事项仅适用于MySQL –

0
select items, min(col1), min(col2), min(col3), min(col4), min(col5), min(col6) 
from t 
group by items; 

Select distinct ITEMS, COL1,COL2,COL3,COL4,COL5,COL6 
FROM TABLE 
WHERE (COL10=’1’ or COL2=’1’ or COL3=’1’ or COL4=’1’ or COL5=’1’ or COL6=’1’ 
GROUP BY ITEMS 

Dont use boolean in the Database 
+0

不应该是'MAX()',因为''TRUE'>'FALSE''? – Barmar

相关问题