Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [mysql] Podwójny ORDER BY
neoangin
post 30.06.2011, 18:54:12
Post #1





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 11.07.2006
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


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

Ten post edytował neoangin 30.06.2011, 18:57:56
Go to the top of the page
+Quote Post
toaspzoo
post 30.06.2011, 19:40:31
Post #2





Grupa: Zarejestrowani
Postów: 778
Pomógł: 84
Dołączył: 29.07.2010
Skąd: Gliwice / Pławniowice Mistrz niezmordowanej klawiatury.

Ostrzeżenie: (20%)
X----


Tworzysz zapytania, jeżeli firmy istnieją, to je listujesz...


--------------------

LS Easter egg <
Go to the top of the page
+Quote Post
neoangin
post 30.06.2011, 19:58:17
Post #3





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 11.07.2006
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


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?

Ten post edytował neoangin 30.06.2011, 20:00:13
Go to the top of the page
+Quote Post
rollen
post 30.06.2011, 20:29:10
Post #4





Grupa: Zarejestrowani
Postów: 16
Pomógł: 6
Dołączył: 24.06.2011

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post
neoangin
post 30.06.2011, 22:13:15
Post #5





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 11.07.2006
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


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


Ten post edytował neoangin 30.06.2011, 22:27:36
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.06.2025 - 09:42