2017-04-06 19 views
0

Wenn ich meine Abfrage in Mysql laufe ich immer die folgende Fehlermeldung erhalten:mysql Fehler erscheint weiterhin - # 1241- Operand sollte 1 Spalte (n) enthalten - was bedeutet das?

Operand should contain 1 column(s)

Wie kann ich das Problem beheben?

SELECT(SELECT Tag, COUNT(*) AS magnitude 
FROM (SELECT a.* 
FROM sport b 
join sport a 
on a.Tag = b.Name 
where b.sport_ID > a.sport_ID and a.Tag = 'Football') as ball 
LIMIT 1) 
+0

Höchstwahrscheinlich, weil Sie ein leeres 'SELECT' haben. –

Antwort

0

Für die letzte Auswahl ist keine Spalte angegeben. Versuchen Sie dies:

SELECT * from (SELECT Tag, COUNT(*) AS magnitude 
FROM (SELECT * 
FROM sport b 
join sport a 
on a.Tag = b.Name 
where b.sport_ID > a.sport_ID and a.Tag = 'Football') as ball 
group by Tag 
LIMIT 1) as ball2 

Auch b.sport_ID> b.sport_ID macht keinen Sinn.

+0

immer noch scheint der Fehler – Beck

+0

Die Abfrage aktualisiert. Sie haben auch die Gruppierung nach Klausel verpasst, wenn Sie eine Gruppierungsfunktion haben. Erhalten Sie den gleichen oder einen anderen Fehler? –

+0

Ich bekomme jetzt diese Nachricht # 1248 - Jede abgeleitete Tabelle muss ihren eigenen Alias ​​haben – Beck

1

Ihre Unterabfrage hat zwei Spalten: Tag und Magnitude. Dies ist keine skalare Unterabfrage.

Die Erklärung des Fehlers ist, dass jede Unterabfrage in der Auswahlliste eine skalare Unterabfrage sein muss, was bedeutet, dass sie genau eine Spalte und eine Zeile zurückgeben muss.

Beispiel: Lassen Sie uns es einfach halten und Abfragen von Literalwerten verwenden, sodass wir nicht einmal Tabellen referenzieren. Wir weisen jedem Element in der Auswahlliste einen Spaltenalias zu.

SELECT 
    123 AS colum1, 
    456 AS column2, 
    (SELECT 789, 'abc') AS column3; 

Aber warten Sie! Wie kann sowohl 789 als auch 'abc' der Spaltenalias column3 zugewiesen werden? Das ist mehrdeutig.

Es stellt sich heraus, es ist nicht erlaubt, und wird eine Fehlermeldung, weil es ist mehrdeutig. Die Unterabfrage hat zwei Spalten zurückgegeben, aber dies verstößt gegen die Regel, dass jedes Element in der Auswahlliste der äußeren Abfrage eine Spalte enthalten muss. Wir können es auf diese Weise beheben:

Jetzt gibt jedes Element in der Auswahlliste nur eine Spalte zurück.

Eine ähnliche Regelung besteht, dass eine Unterabfrage in der Auswahlliste erfordert nicht mehr als eine Zeile zurück, auch:

SELECT 
    123 AS colum1, 
    456 AS column2, 
    (SELECT some_column FROM table_with_multiple_rows) AS column3; 

Das ist falsch, weil die Unterabfrage mehr Werte zurückgibt, und es gibt keine Möglichkeit zu stopfen all diese Werte in einer Zeile des Ergebnisses in der äußeren Abfrage.

Es gibt eine Reihe von Möglichkeiten, dies zu lösen. Stellen Sie sicher, dass die Unterabfrage nicht mehr als eine Zeile zurückgibt. Entweder verwenden Sie eine WHERE-Klausel eine Zeile (eine Bedingung auf dem primären oder eindeutigen Schlüssel der Tabelle) angeben:

SELECT 
    123 AS colum1, 
    456 AS column2, 
    (SELECT some_column FROM table_with_multiple_rows 
    WHERE unique_column = 789) AS column3; 

Oder Verwendung LIMIT 1:

SELECT 
    123 AS colum1, 
    456 AS column2, 
    (SELECT some_column FROM table_with_multiple_rows 
    LIMIT 1) AS column3; 

So oder so, Ihre Unterabfrage wird zurückkehren höchstens eine Zeile (es könnte null Zeilen entsprechen, in diesem Fall ist das Ergebnis der Unterabfrage NULL).

+0

Ich bin ziemlich verwirrt jetzt – Beck

+0

@Beck: Siehe meine Beispiele oben. –

+0

Jetzt wird mir gesagt, dass sport_ID ein doppelter Spaltenname ist – Beck

Verwandte Themen