Mam następujący, prosty stółMySQL wynik zestaw uporządkowane według ustalonych pozycjach
Item (id, name, date, fixed_position)
(1, 'first entry', '2016-03-09 09:00:00', NULL)
(2, 'second entry', '2016-03-09 04:00:00', 1)
(3, 'third entry', '2016-03-09 05:00:00', NULL)
(4, 'fourth entry', '2016-03-09 19:00:00', NULL)
(5, 'fifth entry', '2016-03-09 13:00:00', 4)
(6, 'sixth entry', '2016-03-09 21:00:00', 2)
Liczba elementów nie jest ustalony, w rzeczywistości mogą różnić się od ~ 100 do ~ 1000.
Co chcę osiągnąć, to wykonać zapytanie, aby zwrócić zestaw elementów zamówionych przez pole date
, które bierze pod uwagę pole "przypięte" do określonych pozycji. Jeśli fixed_position
dla danego wpisu nie ma wartości NULL, wynik powinien być przypięty do n-tej pozycji, a jeśli fixed_position
ma wartość NULL, to pierwszeństwo ma ORDER BY
.
pożądany wynik zapytania do jaśniejszego wyjaśnienia:
(2, 'second entry', '2016-03-09 04:00:00', 1) // pinned to 1-st position
(6, 'sixth entry', '2016-03-09 21:00:00', 2) // pinned to 2-nd position
(3, 'third entry', '2016-03-09 05:00:00', NULL) // ORDER BY `date`
(5, 'fifth entry', '2016-03-09 13:00:00', 4) // pinned to 4-th position
(1, 'first entry', '2016-03-09 09:00:00', NULL) // ORDER BY `date`
(4, 'fourth entry', '2016-03-09 19:00:00', NULL) // ORDER BY `date`
Próbowałem rozwiązanie pisał w Ordering MySql results when having fixed position for some items ale nawet metodą kopiuj-wklej ten wydaje się nie działać w ogóle.
Co próbowałem tak daleko jest to zapytanie:
SELECT
@i := @i +1 AS iterator,
t.*,
COALESCE(t.fixed_position, @i) AS positionCalculated
FROM
Item AS t,
(
SELECT
@i := 0
) AS foo
GROUP BY
`id`
ORDER BY
positionCalculated,
`date` DESC
Które zwraca:
iterator | id | name | date | fixed_position | positionCalculated
1 1 first entry 2016-03-09 09:00:00 NULL 1
2 2 second entry 2016-03-09 04:00:00 1 1
6 6 sixth entry 2016-03-09 21:00:00 2 2
3 3 third entry 2016-03-09 05:00:00 NULL 3
4 4 fourth entry 2016-03-09 19:00:00 NULL 4
5 5 fifth entry 2016-03-09 13:00:00 4 4
Czy MySQL może wykonać taką czynność czy mam wziąć podejście backend i wykonać PHP array_merge()
na dwóch zestawy wyników?
Co to jest kod SQL, którego używasz? Abyśmy mogli zobaczyć, co próbowaliście. IE: 'zamówienie według daty, ifnull (fixed_position, 0)' –
Dodałem przykładowe zapytanie w moim pytaniu. Spędził ponad 5 godzin na to, szukając odpowiedzi, skończyło się prawie nic. –
Czy 'fixed_position' jest polem w twojej tabeli, czy polem obliczeniowym? –