Bir dizi olarak sonuç ORDER BY döndüren bir SQL

4 Cevap php

Bir ilişkisel dizi olarak gruplar geri dönmek mümkün mü? Ben saf bir SQL çözüm mümkün olup olmadığını bilmek istiyorum. Ben gereksiz şeyler daha karmaşık hale olabilir ama bu bana SQL güç bir fikir vermek için esas olduğunu bırakın unutmayın.

Benim sorunum: Ben alfabetik olarak sıralanmış ve kelimenin ilk harfine göre ayrı gruplar halinde gruplandırılmış olmalıdır veritabanında kelimelerin bir listesi var.

Örneğin:

ape
broom
coconut
banana
apple

olarak iade edilmelidir

array(
'a' => 'ape', 'apple',
'b' => 'banana', 'broom',
'c' => 'coconut'
)

bu yüzden kolayca ilk harf (yani tıklayıp "A" tarafından listeleri resmedebilirler oluşturulan yalnızca sözler Bu daha kolay bana bir sorguda her şeyi yüklemek ve Javascript kriteri listesini yapmak için yapmalıdır b vb ile, "B" ile başlayan gösteriyor yani sayfayı yeniden yükleyin (veya AJAX kullanmak) zorunda kalmadan, göre.

Yan notlar: Ben PostgreSQL kullanıyorum ama MySQL için bir çözüm ben PostgreSQL noktasına deneyebilirsiniz çok çok iyi olurdu. Betik dili PHP.

4 Cevap

MySQL:

SELECT LEFT(word, 1) AS first_letter, 
  GROUP_CONCAT(word) AS word_list
FROM MyTable
GROUP BY LEFT(word, 1);

PostgreSQL 8.4:

SELECT SUBSTRING(word FOR 1) AS first_letter, 
  ARRAY_TO_STRING(ARRAY_AGG(word), ',') AS word_list
FROM MyTable
GROUP BY SUBSTRING(word FOR 1);

http://mssql-to-postgresql.blogspot.com/2007/12/cool-groupconcat.html MySQL en GROUP_CONCAT() PostgreSQL taklit hakkında daha fazla bilgi için bkz.

http://www.postgresonline.com/journal/index.php?/archives/126-PostgreSQL-8.4-Faster-array-building-with-array_agg.html hakkında daha fazla bilgi için bkz: ARRAY_AGG().

26 ayrı sorguları çalıştırın. Veya bir sorgu çalıştırmak ve alfabetik sunucu tarafı sonuçlarını ayırmak.

Eğer LIKE sözdizimi aşina mısınız?

olarak

SELECT * FROM words WHERE col LIKE a% ORDER BY col

Size bir emri ve böylece verecekti. Buna göre karma oluşturun.

Ben hiçbir PostgreSQL uzmanı (veya kullanıcı) ama ben böyle bir şey yapabilirsiniz sonraki sürümlerinde inanıyorum:

SELECT 
    ROW_NUMBER() OVER (PARTITION BY SUBSTRING(whatever from 1 for 1) ORDER BY whatever) AS __ROW,
    whatever
FROM yourtable;

Bu ANSI SQL olduğunu. Ben MySql üzerinde destek henüz neye benzediğini bilmiyorum. Oracle ve SQL Server, bu sözdizimi ile iş ve ben de PostgreSQL 8.4 desteklediği fonksiyonları ile pencere Google'a vasıtasıyla duydum.