Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z sortowaniem MySQL
uraharu
post 2.09.2016, 11:20:27
Post #1





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 19.07.2009

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


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

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
trueblue
post 2.09.2016, 11:50:46
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


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ąć?


--------------------
Go to the top of the page
+Quote Post
uraharu
post 2.09.2016, 12:05:19
Post #3





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 19.07.2009

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


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
Go to the top of the page
+Quote Post
trueblue
post 2.09.2016, 12:19:52
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


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)



--------------------
Go to the top of the page
+Quote Post
uraharu
post 2.09.2016, 12:24:56
Post #5





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 19.07.2009

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


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

jak tego ifa zapakować do order by?
Go to the top of the page
+Quote Post
trueblue
post 2.09.2016, 12:33:39
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Po ORDER BY.


--------------------
Go to the top of the page
+Quote Post
uraharu
post 2.09.2016, 12:55:36
Post #7





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 19.07.2009

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


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

Ten post edytował uraharu 2.09.2016, 12:58:08
Go to the top of the page
+Quote Post
Pyton_000
post 2.09.2016, 13:09:00
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


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
Go to the top of the page
+Quote Post
uraharu
post 2.09.2016, 13:36:26
Post #9





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 19.07.2009

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


niestety nic to nie pomogło, nadal sortuje mi w ten sam sposób mimo, że kolumna to decimal(15,2) :/
Go to the top of the page
+Quote Post
sankalppatil732
post 17.10.2016, 05:48:39
Post #10





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 14.10.2016

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


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
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: 14.08.2025 - 04:22