2012-03-25 4 views
0

Dies ist das richtige geordnetes Array mit MySQL:PostgreSQL Gruppe um Array völlig falsch

[ 
    [1330210800000, 1], 
    [1330297200000, 6], 
    [1330383600000, 10], 
    [1330470000000, 2], 
    [1330556400000, 5], 
    [1330815600000, 9], 
    [1331593200000, 2], 
    [1331852400000, 4], 
    [1331938800000, 8], 
    [1332111600000, 8], 
    [1332198000000, 4], 
    [1332284400000, 8], 
    [1332370800000, 3], 
    [1332630000000, 2] 
] 

Aber mit PostgreSQL dem Array:

[ 
    [1330588800000, 5], 
    [1332399600000, 3], 
    [1330848000000, 9], 
    [1330416000000, 10], 
    [1331622000000, 2], 
    [1330329600000, 6], 
    [1330502400000, 2], 
    [1332140400000, 8], 
    [1332313200000, 8], 
    [1330243200000, 1], 
    [1332226800000, 4], 
    [1331967600000, 8], 
    [1332658800000, 2], 
    [1331881200000, 4] 
] 

Die postgreSQL ist die Reihenfolge falsch und die Daten unterschiedlich und die Anzahl der Kliks:

Dies ist die Abfrage in meinem Controller ist:

@kliks = Klik.count(:group => "DATE(created_at)") 
     .map{|k, v| [(Time.parse(k).to_i * 1000), v] } 
+1

Nicht, dass mein Rails-Wissen rasiermesserscharf ist, aber wenn Sie Dinge nach created_at geordnet haben möchten, müssen Sie nicht ': order => created_at' zu Ihrer Zählung hinzufügen? –

+0

Ich werde es versuchen: order => 'created_at ASC' nur seltsam, dass mySQL es richtig bestellen. Ist die Funktion DATE in postgresql gleich? –

+2

@Railsbeginner: Einige Datenbanken sortieren Dinge als Nebeneffekt der Anwendung einer GROUP BY-Klausel, manche nicht. –

Antwort

4

Sie haben in Ihrer Abfrage keine bestimmte Reihenfolge angegeben, damit die Datenbank Ihre Ergebnisse in beliebiger Reihenfolge zurückgeben kann. Anscheinend bestellt MySQL die Ergebnisse als Nebeneffekt seiner GROUP BY, aber PostgreSQL wird das nicht unbedingt tun. Ihr erster "Bug" ist also nur eine falsche Annahme von Ihrer Seite. Wenn Sie die Datenbank wollen die Sortierung tun, dann wollen Sie so etwas wie:

Klik.count(:group => 'date(created_at)', :order => :date_created_at) 

Wenn Sie die * 1000 werfen und sortieren Sie die Integer-Zeitstempel:

1330210800, 1, MySQL 
1330243200, 1, PostgreSQL 

1330297200, 6, MySQL 
1330329600, 6, PostgreSQL 

1330383600, 10, MySQL 
1330416000, 10, PostreSQL 

... 

Sie werden sehen, dass sie tatsächlich Linie tun ganz in Ordnung, und die Ganzzahl-Zeitstempel unterscheiden sich um 32400s (AKA 9 Stunden) oder 28800s (AKA 8 Stunden oder 9 Stunden mit einer DST-Anpassung) in jedem MySQL/PostgreSQL-Paar. Vermutlich enthalten Sie in einer Ihrer Conversions eine Zeitzone (mit DST), während die andere in UTC verbleibt.

+0

Probieren Sie Klik.find (: alle,: order => 'created_at ASC'). Count (: group => "DATE ​​(created_at)"). Map {| k, v | [(Time.parse (k) .to_i * 1000), v]} Hat die Fehler undefinierte Karte für Fixum. –

+0

Auch versucht: @kliks = Klik.count (: order => 'created_at ASC',: group => "DATUM (created_at)"). Map {| k, v | [(Time.parse (k) .to_i * 1000), v]} Fehler: ActiveRecord :: StatementInvalid (P GError: Fehler: Spalte "kliks.created_at" muss in der GROUP BY-Klausel oder in einem verwendet werden Aggregatfunktion ← [35m2012-03-25T18: 19: 11 + 00: 00 app [web.1]: ← [0m: WÄHLEN COUNT (*) AS count_all, D ATE (created_at) AS date_created_at FROM "kliks" GRUPPE BY DATE (created_at) ODER DER BY created_at ASC): –

+0

Gerade einen Beitrag darüber gefunden: http://hardforum.com/showthread.php?t=1110352 –

0

Sie fehlen wirklich die Bestellklausel. Standardmäßig geben Datenbankserver Gruppen in "zufälliger" Reihenfolge zurück. Die Regel lautet: Wenn Sie die Bestellung reparieren müssen, verwenden Sie immer ORDER BY (in Rails its: order).

+0

Wohin soll die Bestellung gehen? Ich habe einen Fehler in mu kommentiert ist zu kurz Antworten. –

+0

"zufällige Reihenfolge" ist nicht korrekt. "Undefinierte Reihenfolge" ist genauer. –

+0

Deshalb die Zitate. Aber ich stimme zu. – lzap

Verwandte Themen