2009-06-30 49 views
14

MySQL'de doğru şekilde çalışan bu sorguyu kullanıyorum. Daha fazla arka plan üzerinde here.MySQL'i Dönüştürme PostgreSQL'e Dönüştürme

SELECT c.*, SUM(ABS(v.vote)) AS score 
FROM categories c,items i, votes v 
    WHERE c.id = i.category_id 
    AND i.id = v.voteable_id 
    AND v.created_at > '#{1.week.ago}' 
GROUP BY c.id 
ORDER BY score DESC LIMIT 8; 

PostgreSQL'de çalıştırmayı denedim ve bu hata iletisiyle başarısız oldu.

PGError: ERROR: column "c.name" must appear in the GROUP BY clause or be used in an aggregate function

Bunu ne anlama geldiğini emin değildi, bu yüzden bir öğenin adını varsayarak maddesi (MySQL aynı hem çalışması ile gruptaki "c.name" den "c.id" değiştirerek çalıştı benzersiz).

Ancak bu sadece bu sorunun çözülebileceğini nasıl başka benzer hata

PGError: ERROR: column "c.id" must appear in the GROUP BY clause or be used in an aggregate function

üretti?

+1

Garip bir şekilde, bu şimdi Postgre 9.1'de izinli gibi görünüyor. – you786

+0

Postgre 9.2'de kaldırıldı mı? Bu hatayı aynı nedenlerle alıyorum. – Aaron

+1

@Aaron: kaldırılmadı ancak yalnızca (belgeler [http://www.postgresql.org/docs/current/static/sql-select.html)): Aksi, gruplanmamış sütun için geri dönmek için birden fazla olası değeri olacaktır çünkü _The gruplanmamış kolon, gruplanmış sütunlarda işlevsel bağlıdır. Gruplandırılmış sütunlar (veya bunun bir alt kümesi), gruplanmamış sütunları içeren tablonun birincil anahtarıysa işlevsel bağımlılık var demektir. –

cevap

11

Sen de grupluyorsanız SELECT sütun adları listelemek için vardır:

SELECT c.id, c.name, SUM(ABS(v.vote)) AS score 
FROM categories c,items i, votes v 
    WHERE c.id = i.category_id 
    AND i.id = v.voteable_id 
    AND v.created_at > '#{1.week.ago}' 
GROUP BY c.id, c.name 
ORDER BY score DESC LIMIT 8; 

"Bu GROUP BY deyiminde başvurulan değil bir SELECT yan tümcesinde sütun adlarını dahil etmek caiz değildir"

+9

MySQL'de izin verilebilir ve bu yüzden kafası karışmış durumda. Benim düşüncemde Korkunç özelliği – colithium

+0

Bu çalıştı, teşekkürler! –

8

Sadece bu sorunu yaşadım ancak MySQL'den SQL Server'a geçiyorum. Bunun garip olmasına izin verildiğini düşündüm!

Evet, çoğu veritabanında, GROUP BY yan tümcesine sahip olduğunuzda, GROUP BY yan tümcesinde görünen sütun veya sütun kümelerini yalnızca seçebilirsiniz. Bunun nedeni, seçtiğiniz diğer sütunların gerçekten benzersiz olup olmadığını bilmenin bir yolu yoktur.

Gerçekten benzersiz iseler, GROUP BY'de istediğiniz sütunları koyun. Bu MySQL'in "özellikli" olduğunu sorguladı.

MySQL'in davranışı ve bunun nasıl farklı olduğu hakkında bilgi edinebilirsiniz here.

Örnek: Bu şekilde deyimi değiştirirseniz

SELECT c.*, SUM(ABS(v.vote)) AS score 
FROM categories c,items i, votes v 
    WHERE c.id = i.category_id 
    AND i.id = v.voteable_id 
    AND v.created_at > '#{1.week.ago}' 
GROUP BY c.id, c.name, c.whatever_else 
ORDER BY score DESC LIMIT 8; 
+0

MySQL bağlantısı için teşekkürler, şimdi daha mantıklı! Bu durumda benim c.id'im her zaman benzersizdir, bu yüzden muhtemelen iyiydi, ama en azından şimdi neden yaptığını biliyorum. Teşekkürler! –

2

çalışması gerekir:

SELECT c.id, SUM(ABS(v.vote)) AS score 
FROM categories c,items i, votes v 
    WHERE c.id = i.category_id 
    AND i.id = v.voteable_id 
    AND v.created_at > '#{1.week.ago}' 
GROUP BY c.id 
ORDER BY score DESC LIMIT 8; 

Ben MySQL sonucu verir emin değilim, ama size çok küçük vermek Bu PostgreSQL çalışmaz neden örneği aşağıdaki categories masada bir göz atın:

id | name 
---|----- 
1 | ABC 
1 | DEF 

id tarafından gruplandırıldı, böylece sonuçtaki her satır yalnızca bir tane id içermelidir. Ayrıca, name seçerseniz, gruplama yapmadan name için sonuçta ne gösterilmelidir?

Ya ABC veya DEF olabilir, ancak veritabanı altyapısı sizin için gerçekten karar veremez (her ne kadar MySQL görünürse de).

+1

MySQL rastgele birini seçiyor! Bu garip değil mi? Birkaç gün önce bunun hakkında bir soru sordum. – colithium

+0

Bunun böyle olduğunu bile bilmiyordum. Çok garip ... –

+0

İlginç ... Bu durumda en azından kimliğim her zaman benzersizdir, bu yüzden gruplamak için iyi bir sütun oldu. Kategorinin ismine de ihtiyacım vardı, bu yüzden hem select'te hem de grupta listeledim. İşe benziyor. Teşekkürler! –