İki Sütun tarafından PHP MySQL Sipariş

6 Cevap php

Ben iki sütun tarafından bazı verileri sıralamak için çalışıyorum, ama çalışıyor gibi görünmüyor. Ne istiyorum o en son tarih, ilk yüksek puan sıralama kriteri makaleleri vardır. Örnek olarak, bu (sol # değerlendirme, daha sonra makale başlığı, daha sonra makale tarih olan) bir örnek çıktı olurdu


50 | This article rocks          | Feb 4, 2009
35 | This article is pretty good | Feb 1, 2009
5  | This Article isn't so hot   | Jan 25, 2009

I istimal ilgili SQL olduğunu:

ORDER BY article_rating, article_time DESC

Bu article_time DESC göre sıralama gibi görünüyor. Ben bir ya da diğer, ancak her ikisine göre sıralayabilir, ben belirgin bir şey eksik?

6 Cevap

Varsayılan sıralama yükseliyor, size emir hem anahtar kelime DESC eklemeniz gerekir:

ORDER BY article_rating DESC, article_time DESC
ORDER BY article_rating, article_time DESC

aynı derece ile iki makale vardır yalnızca article_time göre sıralamak olacaktır. Ben sizin örnekte görebilirsiniz her gelen, bu tam olarak ne olduğunu.

↓ primary sort                         secondary sort ↓
1.  50 | This article rocks          | Feb 4, 2009    3.
2.  35 | This article is pretty good | Feb 1, 2009    2.
3.  5  | This Article isn't so hot   | Jan 25, 2009   1.

ama göz önünde bulundurun:

↓ primary sort                         secondary sort ↓
1.  50 | This article rocks          | Feb 2, 2009    3.
1.  50 | This article rocks, too     | Feb 4, 2009    4.
2.  35 | This article is pretty good | Feb 1, 2009    2.
3.  5  | This Article isn't so hot   | Jan 25, 2009   1.

Bu belki iki sütun ile tablo sıralamak için yol arıyor birini, ancak paralel bir şekilde yardımcı olur. Bu toplu sıralama fonksiyonunu kullanarak iki türlü birleştirmek anlamına gelir. Örneğin tam arama kullanarak ve aynı zamanda makale yayınlama tarihi ile ilgili makaleler alınırken çok yararlıdır.

Bu sadece bir örnek, ancak fikir yakalamak eğer toplama bir çok fonksiyonu kullanmak için bulabilirsiniz. Hatta saniyenin üzerinde bir tercih sütunları ağırlık olabilir. Benim fonksiyonu bu yüzden en değerli satırlar üstüne, iki türlü aşırı alır.

Maalesef orada bu işi yapmak için daha basit çözümler var, ama herhangi bulamadım eğer.

SELECT
 `id`,
 `text`,
 `date`
 FROM
   (
   SELECT
     k.`id`,
     k.`text`,
     k.`date`,
     k.`match_order_id`,
     @row := @row + 1 as `date_order_id`
     FROM
     (
       SELECT
         t.`id`,
         t.`text`,
         t.`date`,
         @row := @row + 1 as `match_order_id`
         FROM
         (
           SELECT
             `art_id` AS `id`,
             `text`   AS `text`,
             `date`   AS `date`,
             MATCH (`text`) AGAINST (:string) AS `match`
             FROM int_art_fulltext
             WHERE MATCH (`text`) AGAINST (:string IN BOOLEAN MODE)
             LIMIT 0,101
         ) t,
         (
           SELECT @row := 0
         ) r
         ORDER BY `match` DESC
     ) k,
     (
       SELECT @row := 0
     ) l
     ORDER BY k.`date` DESC
   ) s
 ORDER BY (1/`match_order_id`+1/`date_order_id`) DESC

ASC, article_time DESC article_rating İLE SİPARİŞ

Sonunda DESC azalan iki sütuna göre sıralamak olacaktır. Eğer aksi ise, ASC belirtmek zorunda

Azalan, article_time DESC article_rating İLE SİPARİŞ

Bu azalan sırayla her iki sütuna bağlı olarak verilerinizi sipariş edilecektir.

You can order by multiple columns in mysql.
The first order take first preference and then second one get next preference in mysql.

ORDER BY article_rating DESC, article_time DESC

Daha fazla ayrıntı için orderby