2010-02-01 1 views
18

Ich habe eine MySQL-Abfrage, die eine einzelne Zeile zurückgibt, die eine Reihe von 1s und 0s ist. Es ist für einen Fortschrittsbalken Indikator. Ich habe es jetzt im Code summiert, aber ich habe versucht, die Werte in einer Abfrage zu summieren, und erkannte, dass ich SUM() nicht verwenden konnte, weil es viele Spalten, aber nur eine Zeile sind.Summenwerte einer einzelnen Zeile?

Gibt es eine Möglichkeit, das ich das in der Abfrage automatisch summieren kann? Es ist so:

item_1 | item_2 | item_3 | item_4 
-------+--------+--------+-------- 
    1 |  1 |  0 |  0 

Edit: Ich vergaß zu erwähnen, item_1 und so weiter sind nicht einfache Feldwerte, aber jeder ist eher ein Ausdruck, wie SELECT IF(field_1 = 1 and field_2 IS NOT NULL, 0, 1) AS item_1 ..., so sieht es aus wie ich zu tun habe eine verschachtelte Abfrage:

SELECT (item_1 + item_2 ...) FROM (SELECT IF(field_1 = y and field_2 IS NOT NULL, 1, 0) AS item_1 ...) AS alias 

Korrekt?

Antwort

39
select item_1 + item_2 + item_3 + item_4 as ItemSum 
from MyTable 

Wenn Nullwerte sein können, müssen Sie sie wie folgt behandeln:

select ifnull(item_1, 0) + ifnull(item_2, 0) + ifnull(item_3, 0) + ifnull(item_4, 0) as ItemSum 
from MyTable 
+0

Ah! Da es sich um Ausdrücke handelt und nicht um einfache Werte, könnte ich eine geschachtelte Abfrage machen: SELECT (item_1 + item_2 ...) FROM (SELECT IF (field_1 = y und field_2 IST NICHT NULL, 1, 0) AS item_1 ...) AS-Alias. Richtig? – user151841

+0

Ja, das wird funktionieren. – RedFilter

4

Sie können nicht wirklich tun es einfacher als:

SELECT item_1 + item_2 + item_3 + item_4 
FROM Table1 

Wenn Sie haben eine Menge Spalten, dann wird es eine Weile dauern. Ich denke, es hat ziemlich lange gedauert, um den Tisch zu erstellen.

In Zukunft entwerfen Sie Ihre Tabellen anders, so dass jede Phase des Prozesses eine Zeile und keine Spalte ist. Mit anderen Worten: dieser, statt:

id, item_number, value 

Und dann können Sie es wie folgt abfragen:

id, item_1, item_2, item_3, item_4 

Ihre Tabelle wie folgt aussehen könnte

SELECT SUM(value) 
FROM Table1 
WHERE id = @id 

In der Tat, werden Sie wahrscheinlich brauche nicht einmal die value-Spalte. Die Anwesenheit oder Abwesenheit der Reihe ist genug Information. So Ihre Anfrage wird:

SELECT COUNT(*) 
FROM Table1 
WHERE id = @id 

Es ist vielleicht ein bisschen spät für Sie dieses Mal, aber wenn Sie noch eine Chance haben, um den Entwurf zu ändern, dann könnte es sein, das eine Überlegung wert.

+0

Ich kann nicht wirklich die Tabelle des anderen Designs, das Sie beschreiben, machen, weil jedes 'Element' eigentlich ein boolesches Flag und ein Wert ist, jeder von einem anderen Typ. Die Werte von item_1 könnten also vom Datentyp date, item_2, string usw. sein. Ich könnte diese Werte immer noch in einen einzelnen String-Spaltentyp schreiben, aber dann konnte ich keine nativen Abfragen für diese Spalte ausführen, wie Datumsberechnungen oder SUM(). – user151841

+0

Ja, wenn es sich um verschiedene Typen handelt, wäre es eine schlechte Idee, sie in dieselbe Spalte zu stellen. –