2012-08-15 21 views
5

Son zamanlarda başarıyla derleyen ve istenen sonucu döndüren bir sorgu oluşturdum. Bu kod parçasını, yığın akışındaki bir kullanıcının bana geldiği başka bir kod parçasında bir alt sorgu olarak kullandığımda, sonuçta çözülen birkaç sorunla karşılaştım. Bu sorguyu bana verilen kod parçasında bir alt sorgu olarak kullanmaya çalıştım. Ancak, sql keman hiçbir şey döndürmez. Hata veya derlenmiş mesaj yok. Rastgele bir + işaret gibi bir sözdizimi hatası koymaya çalıştığımda hiçbir şey olmadı. sorgu çok uzun olduğu için mi?sql kemanın işleyebileceği bir sınır var mı? sql fiddle hiçbir şey derlemez ve hata iletileri döndürmez

şema

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) 

sorgu

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

Sorunuza sorgunun eklenmesi yardımcı olabilir. SQLFiddle örneği daha fazla yardımcı olabilir. –

+1

sorun sql keman derleme değil. bu yüzden sorguya bir link alamıyorum. ama sorguyu göndereceğim. onun gerçekten uzun olmasına rağmen – user1569897

+0

Belki de oluşturma tablosu + ekleme ifadelerini de içermelisiniz. (Özellikle SQLFiddle yaratıcısı Jake Feasel'in muhtemelen bu soruyu bulacağı için.) BTW, sorgunuz örneğin phpMyAdmin altında çalışıyor mu? – biziclop

cevap

5

ben this keman Sorgunuzu takılı ettik ve şimdi sorun bakın. Sorgunuz 8000 karakterden uzun (tam olarak 8423) ve bu mesajı sonuç panelinde göstermiyorum. Temel olarak, bu, daha önce fark etmediğim SQL Fiddle'daki bir görüntüleme hatasıdır (bu yüzden bunu dikkatime sunduğunuz için teşekkürler!).

Bu sırada, karakterlerin bazılarını 8000 karakter sınırına sığdırmak için kesmeyi deneyebilirsiniz.

+1

İlginçtir, "SQL'i Biçimle" sorgunuzla birlikte vurduğumda, karakter sayısını 8000 limiti içinde azaltır: http: // sqlfiddle. com/#! 2/97a57/1 –

+0

Teşekkürler. Phpmyadmin'de denedim ve işe yarıyor. – user1569897

İlgili konular