2016-09-30 3 views
1

Ich habe eine gespeicherte Prozedur wie folgt aus:Wie einige Spalten einer gespeicherten Prozedur in Mysql wählen

CREATE PROCEDURE `RankAll`() 
LANGUAGE SQL 
NOT DETERMINISTIC 
READS SQL DATA 
SQL SECURITY INVOKER 
COMMENT '' 
BEGIN 
    select userID,sum(score) as score,@rank := @rank + 1 AS rank from 
    (
     select userID,score from ScoreMessages 
     union all 
     select userID,score from ScoreExams 
    ) as scores 
    JOIN (SELECT @rank := 0) rank 
    group by userID 
    order by score desc; 
END 

Eigentlich ich es als eine Ansicht verwenden wollte, aber ich habe Variablen, weil ich sie und sie ordnen wollte ließ mich es nicht in einer Ansicht verwenden.

habe ich versucht, die Abfrage unten, aber es ist nicht korrekt:

select * from (Call `RankAll`()) 

So wie kann ich mehrere Spalten aus ihr wählen?

+0

Ich denke, Sie müssen die gespeicherte Prozedur speichern ihre Ergebnisse in einer temporären Tabelle speichern. Dann können Sie aus dieser Tabelle auswählen. Siehe http://stackoverflow.com/questions/2466713/use-result-set-of-mysql-stored-procedure-in-otherother-stored- procedure für ein ähnliches Problem. – Barmar

+0

Es ist nicht möglich, die Ergebnismenge (n) zu verwenden, die von einer Prozedur in einer anderen SQL-Anweisung zurückgegeben werden. Die Prozedur kann nicht als Zeilenquelle für eine Abfrage referenziert werden. Wenn Sie SQL Server verwenden, können Sie eine Tabellenwertfunktion schreiben. Am nächsten kommt man in MySQL, wenn die Prozedur eine temporäre Tabelle auffüllt und dann in einer separaten Abfrage auf die temporäre Tabelle verweist. Mit dem hier gezeigten Beispiel könnte die Abfrage in der Prozedur aus der Prozedur herausgenommen und als Inline-Ansichtsdefinition verwendet werden. (Ersetzen Sie 'Call RankAll' durch die Abfrage. Und weisen Sie natürlich einen Tabellenalias zu.) – spencer7593

Antwort

1

Es ist nicht möglich, die Ergebnismenge (n) zu verwenden, die von einer Prozedur in einer anderen SQL-Anweisung zurückgegeben werden. Eine Prozedur kann nicht als Zeilenquelle innerhalb einer Abfrage referenziert werden.

Wenn wir SQL Server verwenden, könnten Sie eine Tabellenwertfunktion schreiben. Aber das können wir in MySQL nicht machen. Am nächsten kommt man in MySQL, wenn eine Prozedur eine temporäre Tabelle auffüllt und dann die temporäre Tabelle in einer separaten Abfrage referenziert.

Mit dem hier gezeigten Beispiel könnte die Abfrage aus der Prozedur herausgenommen und als Inline-View-Definition verwendet werden. Ersetzen Sie die Call RankAll() durch die tatsächliche Abfrage. Und natürlich einen Tabellenalias zuweisen.

SELECT v.userid 
    , v.score 
    , v.rank 
    FROM (-- inline view 
     SELECT s.userid 
       , SUM(s.score) AS score 
       , @rank := @rank + 1 AS rank 
      FROM (SELECT m.userid 
         , m.score 
        FROM ScoreMessages m 
        UNION ALL 
        SELECT e.userid 
         , e.score 
        FROM ScoreExams e 
       ) s 
      CROSS 
      JOIN (SELECT @rank := 0) i 
      GROUP BY s.userid 
      ORDER BY s.score DESC 
     ) v 
0

Verwenden Sie einfach:

call RankAll() 

Der Aufruf returs das Ergebnis eingestellt, wie wenn Sie die gleiche SQL-Abfrage ausführen würde.

+0

Wie kann ich also mehrere Spalten daraus auswählen? –

+0

MySQL hat kein Konzept der Tabellenwertfunktion. Was Sie tun müssen, ist, die Ergebnisse in einer temporären Tabelle zu speichern und diese in der aufrufenden Prozedur/Anwendung zu verwenden. – slaakso

+0

MySQL temporäre Tabellen sind für den Prozess sichtbar, während in SQL Server temporäre Tabellen innerhalb der Prozedur sichtbar sind, die Sie erstellen. In MySQL können Sie eine temporäre Tabelle erstellen, die Prozedur aufrufen, um sie aufzufüllen, und dann die Ergebnismenge nach dem Aufruf verwenden. So: drop temporäre Tabelle, wenn vorhanden data_tmp; temporäre Tabelle erstellen data_tmp (id int, score int, rank int); Ruf RankAll();/* befüllen Sie die Daten_TMP */ Wählen Sie * aus data_tmp; – slaakso

Verwandte Themen