Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z sortowaniem MySQL
Forum PHP.pl > Forum > Bazy danych > MySQL
uraharu
Witam,

niestety od dłuższego czasu męczę się z prostym zapytaniem SQL, wszystko działa oprócz sortowania.

kod
  1. DECLARE skip INT;
  2. SET skip = (pPageCurrent-1)*pPageCount;
  3.  
  4.  
  5. SELECT SQL_CALC_FOUND_ROWS
  6. l.OrderId,
  7. l.Amount,
  8. l.Date AS AuctionDate,
  9. l.Reference,
  10. l.ServiceId,
  11. l.VisitorId,
  12. l.ClickId,
  13. l.StatusId,
  14. l.StatusDate,
  15. l.ProgramId,
  16. l.PartnerId,
  17. l.DenyReason,
  18. mp.ProgramName,
  19. pc.Date AS ClickDate,
  20. afs.SiteName
  21. FROM
  22. PaymentOrders AS l
  23. INNER JOIN
  24. AffiliateData AS afd ON afd.UserShortGuid = l.PartnerId
  25. AND (pAffiliateId IS NULL
  26. OR afd.UserShortGuid = pAffiliateId)
  27. INNER JOIN
  28. PaymentOrdersClicks AS pc ON pc.ClickId = l.ClickId
  29. INNER JOIN
  30. MerchantPrograms AS mp ON mp.ProgramId = l.ProgramId
  31. LEFT JOIN
  32. AffiliateSites AS afs ON (afs.SiteShortGuid = l.AffiliateSiteId)
  33. WHERE
  34. (pSearchText IS NULL
  35. OR l.Reference LIKE CONCAT('%', pSearchText, '%')
  36. OR pc.IpAdress LIKE CONCAT('%', pSearchText, '%')
  37. OR mp.ProgramName LIKE CONCAT('%', pSearchText, '%'))
  38. AND (pServiceId IS NULL
  39. OR mp.ServiceId = pServiceId)
  40. AND (pProgramId IS NULL
  41. OR l.ProgramId = pProgramId)
  42. AND (pStatusId IS NULL
  43. OR FIND_IN_SET(l.StatusId, pStatusId))
  44. AND (l.Date BETWEEN pDateFrom AND pDateTo)
  45. ORDER BY CASE pSortOrder = FALSE
  46. WHEN pSortColumn='amount' THEN l.Amount
  47. WHEN pSortColumn='statusid' THEN l.StatusId
  48. WHEN pSortColumn='auctiondate' THEN l.Date
  49. WHEN pSortColumn='sitename' THEN afs.SiteName
  50. WHEN pSortColumn='programname' THEN mp.ProgramName
  51. WHEN pSortColumn='clickdate' THEN pc.Date
  52. WHEN pSortColumn='statusdate' THEN l.StatusDate
  53. END, CASE pSortOrder = TRUE
  54. WHEN pSortColumn='amount' THEN l.Amount
  55. WHEN pSortColumn='statusid' THEN l.StatusId
  56. WHEN pSortColumn='auctiondate' THEN l.Date
  57. WHEN pSortColumn='sitename' THEN afs.SiteName
  58. WHEN pSortColumn='programname' THEN mp.ProgramName
  59. WHEN pSortColumn='clickdate' THEN pc.Date
  60. WHEN pSortColumn='statusdate' THEN l.StatusDate
  61. END DESC
  62. LIMIT PPAGECOUNT OFFSET SKIP;
  63.  
  64. SELECT FOUND_ROWS() AS Count;


wynik zwraca poprawnie, jednak sortowanie po kolumnach nie działa, w czym może być problem?

dziękuje za pomoc

trueblue
Pomieszałeś dwie składnie CASE, tzn. składnia jest poprawna, ale źle użyłeś.

Albo:
  1. CASE pSortColumn
  2. WHEN 'amount' THEN l.Amount
  3. WHEN 'statusid' THEN l.StatusId


Albo:
  1. CASE
  2. WHEN pSortColumn='amount' THEN l.Amount
  3. WHEN pSortColumn='statusid' THEN l.StatusId


Jaki efekt chcesz osiągnąć?
uraharu
dzięki za pomoc, wcześniej robiłem to w ten sposób

  1. ORDER BY
  2. CASE WHEN pSortColumn='amount' AND pSortOrder=true THEN l.Amount END DESC,
  3. CASE WHENpSortColumn='amount' AND pSortOrder=falseTHEN l.Amount END ASC


niestety to także nie działało

efekt ma być taki, że :

posiadam 2 zmienne pSortColumn określającą nazwe kolumny po której chce sortować oraz pSortOrder określającą kierunek sortowania (ASC,DESC)
przekazuje do procedury obie zmienne i na ich podstawie wykonuje sortowanie

niestety przetestowałem już wiele sposobów i żaden nie działa
w MSSQL ten sposób był jak najbardziej poprawny i działał prawidłowo, w MySQL jest już problem
trueblue
To co pokazałeś teraz powinno działać (oczywiście zakładam, że tam gdzie nie ma spacji, docelowo są).

Ewentualnie:
IF(pSortOrder,
CASE grupa_1,
CASE grupa_2)

uraharu
procedura wywołuje się prawidłowo, sortowanie DESC działa, natomiast ASC nie

jak tego ifa zapakować do order by?
trueblue
Po ORDER BY.
uraharu
udało mi się dojść do pewnego dość ciekawego momentu sortowania
ASC i DESC działa, ale nie tak jakbym tego potrzebował

mianowicie

zmienna Amount typ decimal(19,4)
po sortowaniu mam coś takiego

95.00
903.80
79.00
600.99
58.00
540.00
305.00

widać, że w jakiś sposób posortował je, ale nie potraktował jako decimal :/

mój kod order by

  1. CASE pSortOrder
  2. WHEN
  3. 'desc'
  4. THEN
  5. CASE pSortColumn
  6. WHEN 'amount' THEN cast(l.Amount AS decimal(19,2))
  7. WHEN 'auctionDate' THEN l.Date
  8. END
  9. END DESC,
  10. CASE pSortOrder
  11. WHEN
  12. 'asc'
  13. THEN
  14. CASE pSortColumn
  15. WHEN 'amount' THEN cast(l.Amount AS decimal(19,2))
  16. WHEN 'auctionDate' THEN l.Date
  17. END
  18. END
  19.  


dodam, że sortowanie po auctionDate działa prawidłowo
Pyton_000
A spróbuj zamiast robić cast dać coś takiego:

Kod
lenght(l.Amount) DESC, l.Amount

Analogicznie ASC.


Ja ostatnio sortowałem liczbowo w formacie: 234-23423
uraharu
niestety nic to nie pomogło, nadal sortuje mi w ten sam sposób mimo, że kolumna to decimal(15,2) :/
sankalppatil732
Sometimes you might want to sort names. If you have First and Last names in one field, separated by a blank, you can do this by:
SELECT * FROM my_addressbook ORDER BY SUBSTRING_INDEX(name, ' ', -1) ASC
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-2024 Invision Power Services, Inc.