Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] Podwójny ORDER BY
Forum PHP.pl > Forum > Bazy danych > MySQL
neoangin
Witam, mam problem z napisaniem zapytania mysql. OPiszę najpierw co chciałbym osiagnac.

Chce wyświetlić posortowane firmy, które sa w katalogu wedle dwóch kreteriów. PIerwszy to data dodania , drugi data dokonania ostatniej platnosci. Wartosci tych pol mam wySELECTowane:

  1. SELECT ... c.createDate , MAX(cp.paymentDate) AS maxDate ...


I chodzi mi o to zeby na stronie glownej portalu na gorze pojawialy się firmy na zasadzie:

Każda firma przedłużająca pakiet (czyli placaca za niego) pokazuje się po przedłużeniu jako PIERWSZA – Ważne – NA STRONIE GŁÓWNEJ portalu . Tak samo jak to jest z firmami nowododającymi się.

Domyslam sie ze musze uzyc formuly "IF" , ale moze sie myle. Czy ktoś może pomóc?

  1. ORDER BY c.createDate DESC, maxDate DESC
.. ? - takie zapytanie nie dziala poprawnie gdyz tylko pierwszy ORDER jest brany pod uwage
toaspzoo
Tworzysz zapytania, jeżeli firmy istnieją, to je listujesz...
neoangin
Wszystkie firmy istnieją. Chodzi o to że niektóre nowododane są "w okresie darmowym" - czyli nie mają daty płatności żadnej. Mam na szczęście flage z widoku, która mi mówi czy jest w okresie darmowym dana firma:

cs.isFreePeriod = 1 gdy w darmowym,
cs.isFreePeriod = 0 gdy nie w darmowym


idąc tropem dokumentacji : http://dev.mysql.com/doc/refman/5.0/en/con...function_ifnull
myślę , że mogę użyć klauzuli CASE:

  1. SELECT
  2. ...
  3. (CASE cs.isFreePeriod WHEN 1 THEN c.createDate ELSE MAX(cp.paymentDate)) AS szukanyDate,
  4. ...

- tylko blędy mi sypie phpmyadmin, pewnie cos z ''. Skoryguje ktos?
rollen
A może w części ORDER BY daj:

  1. ORDER BY GREATEST(c.createDate, maxDate) DESC


Sortowanie zostanie wykonane po większej z wartości (c.createDate, maxDate)
neoangin
Niestety z GREATEST nie działa poprawnie. Sortuje tylko podbite firmy. Podejrzewam, że dlatego bo na tabele companyPayments jest LEFT JOIN.

Ale pokombinowalem z tym CASE i dziala teraz dobrze. Oto caly dzialajacy kod:


  1.  
  2. SELECT SQL_CALC_FOUND_ROWS
  3. c.idCompany, c.idProvince, c.idCompanyEnc, c.companyName, c.companyAlias, c.companyPhone, c.companyFax, c.companyEmail, c.companyWWW, c.companyCity, c.modifyDate, c.createDate, cd.companyDesc, cd.companyContact, cs.isPremium,
  4.  
  5. [b]CASE cs.isFreePeriod WHEN 1 THEN c.createDate ELSE MAX(cp.dateAdd) end AS szukanyDate[/b]
  6.  
  7. FROM v_companies_statuses cs
  8. LEFT JOIN companies c ON c.idCompany = cs.idCompany
  9. LEFT JOIN companyDetails cd ON cd.idCompany = cs.idCompany AND cd.idLanguage = 1
  10. LEFT JOIN companyPayments cp ON c.idCompany = cp.idCompany
  11.  
  12. WHERE
  13. c.isActive = 1
  14. AND cs.isVisible = 1
  15. AND c.isDeleted = 0
  16.  
  17. GROUP BY c.idCompany
  18. ORDER BY szukanyDate DESC
  19. LIMIT 0,10
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.