2012-08-15 4 views
5

Ich habe vor kurzem eine Abfrage erstellt, die erfolgreich kompiliert und das gewünschte Ergebnis zurückgibt. Als ich diesen Code als Unterabfrage in einem anderen Codeabschnitt verwendete, den ein Benutzer auf stackoverflow für mich entwickelte, stieß ich auf einige Probleme, die letztendlich gelöst wurden. Ich habe versucht, diese Abfrage als Unterabfrage in dem Code zu verwenden, der mir übergeben wurde. Sql fiddle gibt jedoch nichts zurück. Keine Fehler oder kompilierte Nachrichten. Als ich versuchte, einen Syntaxfehler zu schreiben - wie ein zufälliges + -Zeichen - passierte nichts. liegt es daran, dass die Abfrage zu lang ist?gibt es eine beschränkung auf was sql fiddle kann? sql fiddle kompiliert nichts und gibt keine Fehlermeldungen zurück

Schema

CREATE TABLE sampleData 
    (
    id MEDIUMINT NOT NULL AUTO_INCREMENT, 
     timecode int, 
    count int, 
     PRIMARY KEY (id) 
    ) 
#ENGINE=MyISAM 
; 

INSERT INTO sampleData 
(timecode, count) 
VALUES 
(1344893440, 1), (1346014720, 1),(1344898688,1),(1345654784,1),(1345978368,1), 
(1345959296,1), (1345064704,1), (1345156352,1),(1345225600,1), 
(1345017984,1),(1345640960,1),(1346019968,1),(1345834752,1), 
(1345438464,1),(1344986880,1),(1345045632,1),(1345557888,1),(1344973056,1),(1345087232,1),(1345433216,1),(1345691008,1), 
(1344917760,1),(1345253248,1),(1344934912,1),(1345890048,1),(1345272448,1), (1345829504,1),(1345798400,1),(1345203200,1),(1344741120,1), 
(1345175552,1),(1344824192,1),(1344926336,1),(1345571712,1),(1344931584,1),(1345211776,1),(1345059456,1),(1345516288,1),(1345441920,1),(1346009472,1) 

Abfrage

select t_0.*, 
      (coalesce(t_3.average_number_of_votes_per_previous_period_days, 0) - coalesce(t_4.average_number_of_votes_per_previous_period_days, 0)) * 100.0 
    from 
     (select t.*, 
      (coalesce(t_1.count, 0) - coalesce(t_2.count, 0)) * 100.0 as "percentage increase in count in %" 
    from 
    (
     SELECT sum(1) AS ordr, 
     t1.id,t1.day, t1.count, SUM(t2.count) as aggregate, (SUM(t2.count)-t1.count)/(sum(1)-1) as "average_number_of_votes_per_previous_period_days" 

     FROM 
     (SELECT id, date(FROM_UNIXTIME(timecode)) AS day,(FROM_UNIXTIME(timecode)) AS original, COUNT(1) as 'count' 
     FROM sampleData 
     GROUP BY DAY) t1 
     INNER JOIN 
     (SELECT date(FROM_UNIXTIME(timecode)) AS day,(FROM_UNIXTIME(timecode)) AS original, COUNT(1) as 'count' 
     FROM sampleData 
     GROUP BY DAY) t2 
     on t1.day >= t2.day                                 
     GROUP BY t1.day, t1.count 
     ORDER BY t1.day 
     )t 
     left outer join 
     (
      SELECT sum(1) AS ordr, 
      t1.id,t1.day, t1.count, SUM(t2.count) as aggregate, (SUM(t2.count)-t1.count)/(sum(1)-1) as "average_number_of_votes_per_previous_period_days" 
      FROM 
      (SELECT id, date(FROM_UNIXTIME(timecode)) AS day,(FROM_UNIXTIME(timecode)) AS original, COUNT(1) as 'count' 
      FROM sampleData 
      GROUP BY DAY) t1 
      INNER JOIN 
      (SELECT date(FROM_UNIXTIME(timecode)) AS day,(FROM_UNIXTIME(timecode)) AS original, COUNT(1) as 'count' 
      FROM sampleData 
      GROUP BY DAY) t2 
      on t1.day >= t2.day                                 
      GROUP BY t1.day, t1.count 
      ORDER BY t1.day 
     )t_1 
     on t.ordr = t_1.ordr + 1 left outer join 
     (
      SELECT sum(1) AS ordr, 
      t1.id,t1.day, t1.count, SUM(t2.count) as aggregate, (SUM(t2.count)-t1.count)/(sum(1)-1) as "average_number_of_votes_per_previous_period_days" 
      FROM 
       (SELECT id, date(FROM_UNIXTIME(timecode)) AS day,(FROM_UNIXTIME(timecode)) AS original, COUNT(1) as 'count' 
       FROM sampleData 
       GROUP BY DAY) t1 
      INNER JOIN 
       (SELECT date(FROM_UNIXTIME(timecode)) AS day,(FROM_UNIXTIME(timecode)) AS original, COUNT(1) as 'count' 
       FROM sampleData 
       GROUP BY DAY) t2 
      on t1.day >= t2.day                                 
      GROUP BY t1.day, t1.count 
      ORDER BY t1.day 
      ) t_2 
     on t.ordr = t_2.ordr + 2)t_0 
    left outer join 
     (select t.*, 
      (coalesce(t_1.count, 0) - coalesce(t_2.count, 0)) * 100.0 as "percentage increase in count in %" 
    from 
    (
     SELECT sum(1) AS ordr, 
     t1.id,t1.day, t1.count, SUM(t2.count) as aggregate, (SUM(t2.count)-t1.count)/(sum(1)-1) as "average_number_of_votes_per_previous_period_days" 

     FROM 
     (SELECT id, date(FROM_UNIXTIME(timecode)) AS day,(FROM_UNIXTIME(timecode)) AS original, COUNT(1) as 'count' 
     FROM sampleData 
     GROUP BY DAY) t1 
     INNER JOIN 
     (SELECT date(FROM_UNIXTIME(timecode)) AS day,(FROM_UNIXTIME(timecode)) AS original, COUNT(1) as 'count' 
     FROM sampleData 
     GROUP BY DAY) t2 
     on t1.day >= t2.day                                 
     GROUP BY t1.day, t1.count 
     ORDER BY t1.day 
     )t 
     left outer join 
     (
      SELECT sum(1) AS ordr, 
      t1.id,t1.day, t1.count, SUM(t2.count) as aggregate, (SUM(t2.count)-t1.count)/(sum(1)-1) as "average_number_of_votes_per_previous_period_days" 
      FROM 
      (SELECT id, date(FROM_UNIXTIME(timecode)) AS day,(FROM_UNIXTIME(timecode)) AS original, COUNT(1) as 'count' 
      FROM sampleData 
      GROUP BY DAY) t1 
      INNER JOIN 
      (SELECT date(FROM_UNIXTIME(timecode)) AS day,(FROM_UNIXTIME(timecode)) AS original, COUNT(1) as 'count' 
      FROM sampleData 
      GROUP BY DAY) t2 
      on t1.day >= t2.day                                 
      GROUP BY t1.day, t1.count 
      ORDER BY t1.day 
     )t_1 
     on t.ordr = t_1.ordr + 1 left outer join 
     (
      SELECT sum(1) AS ordr, 
      t1.id,t1.day, t1.count, SUM(t2.count) as aggregate, (SUM(t2.count)-t1.count)/(sum(1)-1) as "average_number_of_votes_per_previous_period_days" 
      FROM 
       (SELECT id, date(FROM_UNIXTIME(timecode)) AS day,(FROM_UNIXTIME(timecode)) AS original, COUNT(1) as 'count' 
       FROM sampleData 
       GROUP BY DAY) t1 
      INNER JOIN 
       (SELECT date(FROM_UNIXTIME(timecode)) AS day,(FROM_UNIXTIME(timecode)) AS original, COUNT(1) as 'count' 
       FROM sampleData 
       GROUP BY DAY) t2 
      on t1.day >= t2.day                                 
      GROUP BY t1.day, t1.count 
      ORDER BY t1.day 
      ) t_2 
     on t.ordr = t_2.ordr + 2) t_3 
     on t.ordr = t_3.ordr + 1 
    left outer join 
     (select t.*, 
      (coalesce(t_1.count, 0) - coalesce(t_2.count, 0)) * 100.0 as "percentage increase in count in %" 
    from 
    (
     SELECT sum(1) AS ordr, 
     t1.id,t1.day, t1.count, SUM(t2.count) as aggregate, (SUM(t2.count)-t1.count)/(sum(1)-1) as "average_number_of_votes_per_previous_period_days" 

     FROM 
     (SELECT id, date(FROM_UNIXTIME(timecode)) AS day,(FROM_UNIXTIME(timecode)) AS original, COUNT(1) as 'count' 
     FROM sampleData 
     GROUP BY DAY) t1 
     INNER JOIN 
     (SELECT date(FROM_UNIXTIME(timecode)) AS day,(FROM_UNIXTIME(timecode)) AS original, COUNT(1) as 'count' 
     FROM sampleData 
     GROUP BY DAY) t2 
     on t1.day >= t2.day                                 
     GROUP BY t1.day, t1.count 
     ORDER BY t1.day 
     )t 
     left outer join 
     (
      SELECT sum(1) AS ordr, 
      t1.id,t1.day, t1.count, SUM(t2.count) as aggregate, (SUM(t2.count)-t1.count)/(sum(1)-1) as "average_number_of_votes_per_previous_period_days" 
      FROM 
      (SELECT id, date(FROM_UNIXTIME(timecode)) AS day,(FROM_UNIXTIME(timecode)) AS original, COUNT(1) as 'count' 
      FROM sampleData 
      GROUP BY DAY) t1 
      INNER JOIN 
      (SELECT date(FROM_UNIXTIME(timecode)) AS day,(FROM_UNIXTIME(timecode)) AS original, COUNT(1) as 'count' 
      FROM sampleData 
      GROUP BY DAY) t2 
      on t1.day >= t2.day                                 
      GROUP BY t1.day, t1.count 
      ORDER BY t1.day 
     )t_1 
     on t.ordr = t_1.ordr + 1 left outer join 
     (
      SELECT sum(1) AS ordr, 
      t1.id,t1.day, t1.count, SUM(t2.count) as aggregate, (SUM(t2.count)-t1.count)/(sum(1)-1) as "average_number_of_votes_per_previous_period_days" 
      FROM 
       (SELECT id, date(FROM_UNIXTIME(timecode)) AS day,(FROM_UNIXTIME(timecode)) AS original, COUNT(1) as 'count' 
       FROM sampleData 
       GROUP BY DAY) t1 
      INNER JOIN 
       (SELECT date(FROM_UNIXTIME(timecode)) AS day,(FROM_UNIXTIME(timecode)) AS original, COUNT(1) as 'count' 
       FROM sampleData 
       GROUP BY DAY) t2 
      on t1.day >= t2.day                                 
      GROUP BY t1.day, t1.count 
      ORDER BY t1.day 
      ) t_2 
     on t.ordr = t_2.ordr + 2) t_4 
     on t_0.ordr = t_4.ordr + 2 
+1

Hinzufügen der Abfrage zu Ihrer Frage könnte helfen. SQLFiddle Beispiel könnte noch mehr helfen. –

+1

Problem ist die SQL-Geige kompiliert nicht. also bekomme ich keinen Link zur Abfrage. aber ich werde die Abfrage posten. es ist wirklich lang, aber – user1569897

+0

Vielleicht sollten Sie auch die create table + insert-Anweisungen zu. (Vor allem, weil SQLFiddle-Entwickler Jake Feasel diese Frage wahrscheinlich finden wird.) BTW, funktioniert Ihre Anfrage unter zum Beispiel phpMyAdmin? – biziclop

Antwort

5

ich Ihre Frage in this Geige gesteckt habe, und ich jetzt das Problem sehen. Ihre Abfrage ist über 8000 Zeichen lang (8423, um genau zu sein), und ich zeige diese Nachricht nicht im Ergebnisbereich. Im Grunde ist dies ein Display-Fehler in SQL Fiddle, den ich vorher nicht bemerkt habe (Danke, dass Sie mich darauf aufmerksam gemacht haben!).

In der Zwischenzeit könnten Sie versuchen, einige der Zeichen auszuschneiden, damit sie innerhalb der 8000-Zeichen-Grenze liegen.

+1

Interessanterweise, wenn ich gerade "Format SQL" mit Ihrer Abfrage dort drücken, reduziert es die Anzahl der Zeichen innerhalb der 8000 Grenze sein: http: // sqlfiddle. com/#! 2/97a57/1 –

+0

danke. Ich habe es in phpmyadmin versucht und es funktioniert. – user1569897