2016-06-06 13 views
0

Ich habe dieseGruppe nach Priorität

+---------+--------+-------+ 
| article | name |status | 
+---------+--------+-------+ 
| 0001 | A  | enable| 
| 0002 | A  | temp | 
| 0003 | B  | enable| 
| 0004 | C  | enable| 
+---------+--------+-------+ 

ich alle aus dieser Tabelle ‚Produkt‘ auswählen möchten, aber ich möchte namentlich Gruppe und wenn es einen Status Temp ist möchte ich die ermöglichen ignorieren Status und zeigt nur das Produkt mit dem Temp Status

Dieses Ergebnis nach Abfrage werden:

+---------+--------+-------+ 
| article | name |status | 
+---------+--------+-------+ 
| 0002 | A  | temp | 
| 0003 | B  | enable| 
| 0004 | C  | enable| 
+---------+--------+-------+ 

Können Sie mir helfen, diese Abfrage zu erstellen?

+0

Was passiert, wenn ein Artikel nur ein 'temp' hat ??? –

+0

Sie sagen, dass Sie nur den Temperaturstatuswert benötigen, warum Sie den Aktivierungsstatus auch anzeigen. –

+0

@RavinderReddy in meinem Fall ein Artikel kann nicht nur Temp sein – John

Antwort

3

Wenn Sie mindestens eine Temperaturgruppe in der Gruppe finden, zeigen Sie sie an. Else Show ermöglichen

select article, name, if(sum(status='temp'), 'temp', 'enable') 
    from thetable 
    group by name 

Zum Artikel entsprechend temporären Status verwenden solche Abfrage

select * from table1 
    where status = 'temp' 
union 
select * from table1 
    where name not in (select distinct name from table1 where status = 'temp') 
+0

Vielen Dank für Ihre Antwort. Aber ich muss die Daten des Temp-Status anzeigen. Mit Ihrer Abfrage ist es unmöglich, sie zu bekommen – John

+0

Was ist * Daten des Temp-Status *? – splash58

+0

Vielen Dank, es funktioniert perfekt :) – John

1

Versuchen Sie, diese zu erhalten, Hoffnung Hilfe für Sie;)

SQL Fiddle

MySQL 5.6 Schema:

CREATE TABLE table1 
    (`article` int, `name` varchar(1), `status` varchar(6)) 
; 

INSERT INTO table1 
    (`article`, `name`, `status`) 
VALUES 
    (0001, 'A', 'enable'), 
    (0002, 'A', 'temp'), 
    (0003, 'B', 'enable'), 
    (0004, 'C', 'enable') 
; 

Abfrage 1:

select t1.* 
from table1 t1 
inner join (
    select count(distinct status) cnt, name, group_concat(status) as names from table1 group by name 
) t2 on t1.name = t2.name 
and (t2.cnt = 1 or (find_in_set('temp', names) > 0 and t1.status = 'temp')) 
group by t1.name, t1.status 

Results:

| article | name | status | 
|---------|------|--------| 
|  2 | A | temp | 
|  3 | B | enable | 
|  4 | C | enable | 
+0

Wow, das ist eine schöne Frage: D. Vielen Dank, du hast mich gerettet. – John