SORU
8 ŞUBAT 2013, Cuma


Grup tarafından daha önce MySQL sipariş

Burada olmak benzer sorular var ama herhangi bir soru yeterli bir cevap olduğunu sanmıyorum.

Geçerli en popüler question devam ve eğer sakıncası yoksa onların örnek kullanacağım.

Bu durumda görev veritabanında her yazar için son mesajı almak için.

Örnek sorgu döndürülen her zaman en son yazı olarak kullanılamaz sonuçlar üretir.

SELECT wp_posts.* FROM wp_posts
    WHERE wp_posts.post_status='publish'
    AND wp_posts.post_type='post'
    GROUP BY wp_posts.post_author           
    ORDER BY wp_posts.post_date DESC

Geçerli kabul edilen cevap

SELECT
    wp_posts.*
FROM wp_posts
WHERE
    wp_posts.post_status='publish'
    AND wp_posts.post_type='post'
GROUP BY wp_posts.post_author
HAVING wp_posts.post_date = MAX(wp_posts.post_date) <- ONLY THE LAST POST FOR EACH AUTHOR
ORDER BY wp_posts.post_date DESC

Ne yazık ki cevap bu kadar basit yanlış olduğunu ve birçok durumda üreten özgün sorgu daha az istikrarlı sonuçlar.

En iyi çözüm olduğu şeklinde bir sorgu kullanmak için

SELECT wp_posts.* FROM 
(
    SELECT * 
    FROM wp_posts
    ORDER BY wp_posts.post_date DESC
) AS wp_posts
WHERE wp_posts.post_status='publish'
AND wp_posts.post_type='post'
GROUP BY wp_posts.post_author 

Benim sorum o zaman çok basit. Zaten bir sorgu başvurmadan önce gruplandırma satır sipariş var mı?

EditBu soruya başka bir soru bir devamı olduğunu ve benim durumun özelliklerini biraz farklıdır. Ve ayrıca bir wp_posts olduğunu varsayalım.kimliği belirli yazı için benzersiz bir tanımlayıcı.

CEVAP
8 ŞUBAT 2013, Cuma


Bir sorgu içinde ORDER BY kullanarak bu sorunun en iyi çözüm değildir.

Yazar tarafından max(post_date) almak için en iyi çözüm max tarihi döndürür ve post_author ve max tarih hem masanız için katılmak için bir sorgu kullanmak için.

Çözüm: olmalıdır

SELECT p1.* 
FROM wp_posts p1
INNER JOIN
(
    SELECT max(post_date) MaxPostDate, post_author
    FROM wp_posts
    WHERE post_status='publish'
       AND post_type='post'
    GROUP BY post_author
) p2
  ON p1.post_author = p2.post_author
  AND p1.post_date = p2.MaxPostDate
WHERE p1.post_status='publish'
  AND p1.post_type='post'
order by p1.post_date desc

Aşağıdaki örnek veri varsa:

CREATE TABLE wp_posts
    (`id` int, `title` varchar(6), `post_date` datetime, `post_author` varchar(3))
;

INSERT INTO wp_posts
    (`id`, `title`, `post_date`, `post_author`)
VALUES
    (1, 'Title1', '2013-01-01 00:00:00', 'Jim'),
    (2, 'Title2', '2013-02-01 00:00:00', 'Jim')
;

Alt sorgu max tarih ve yazarı iade etmek çok kolaydır

MaxPostDate | Author
2/1/2013    | Jim

Sonra masaya geri döneceğini beri, her iki değer bu yazının tüm detaylarını döneceksiniz.

SQL Fiddle with Demo bkz.

Sorgu için doğru bir dönüş bu verileri kullanarak ilgili yorumlarım genişletmek için.

MySQL 15 ** SELECT listesini içeren her sütun için zorlamaz. GROUP BY bir sütun sadece 10 sütun dönüş toplam bir sonucu olarak, diğer sütun döndürülen post_author ait değerleri garanti yok. Eğer a sütununda değilse GROUP BY değer iade edilmelidir ne MySQL seçer.

Toplama işlevi ile alt sorgu kullanarak doğru yazar ve sonrası her zaman iade garanti.

Bir yan not, ise MySQL kullanın ORDER BY bir sorgu sağlar ve sizin için geçerli bir GROUP BY her sütun SELECT liste, bu davranış izin verilmez diğer veritabanları da dahil olmak üzere SQL Server.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Fullscreen

    Fullscreen

    23 Mart 2006
  • FUzzyBUnnyBOoties

    FUzzyBUnnyBO

    3 EKİM 2007
  • Mark Hyder

    Mark Hyder

    6 EKİM 2011