2016-08-11 1 views
0

Ich versuche, eine Abfrage zu schreiben, um in einer einzigen Zeile die Datensätze mit Werten gleich TRUE in mehreren Spalten zu erhalten. Ich dachte, es wird einfach, aber es wird langsam.MySQL - So erhalten Sie eine Zeile aus einer Tabelle mit mehreren Spalten mit True oder False

Nachdem eine Tabelle wie folgt aus:

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 

Ich brauche so etwas zu bekommen:

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

Ich versuchte distinct und group mit in einer einzigen Tabelle, so etwas wie dieses:

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 

Aber es funktioniert nicht, auch ich versuchte, Joins zu den gleiche Tabelle, aber die Ergebnisse waren die gleichen, es zeigt FALSE in Spalten mit TRUE.

Also, kann jemand einen Hinweis geben, wie ich das gewünschte Ergebnis bekommen kann? Vielen Dank im Voraus.

+1

, was Sie zu bekommen suchen, Datensätze, bei denen mindestens 1 Spalte 'true'? –

+0

Wenn Sie nach ITEMS gruppieren, überschreibt die letzte Zeile alle vorherigen ITEMS-Werte. versuche, "GROUP BY ITEMS" zu löschen – SIDU

+0

Danke, aber wenn ich die GROUP BY ITEMS entferne, bekomme ich mehrere Zeilen für das gleiche Element, und ich brauche eine Zeile pro ITEM mit den Spalten mit TRUE als Wert –

Antwort

1

MySQL hat keine Aggregationsfunktionen für Booleans. Dies sind jedoch wirklich 0 (für falsch) und 1 (für wahr) in Verkleidung. Also, versuchen Sie max():

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

Wenn diese als Strings gespeichert werden, dann - durch Zufall - die oben tatsächlich funktioniert, weil 'TRUE'>'FALSE'. Sie könnten mehr methodische sein:

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

+1, aber für was es ist wert "0 = falsch" und "1 = wahr" ist ein MySQL-ism. Nicht unterstützt in Standard-SQL und den meisten anderen Datenbanken. –

+0

Es sieht so aus, als ob er tatsächlich Strings in seinem Tisch speichert, nicht boolean. – Barmar

+0

Danke für Ihren Vorschlag, das hat perfekt funktioniert, auch dank @ Bill Karwin für den Hinweis darüber funktioniert nur in MySQL –

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

oder

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

Sollte es nicht 'MAX()' sein, seit ''TRUE'> 'FALSE''? – Barmar

Verwandte Themen