Tôi đã có sau, đơn giản bảngMySQL kết quả thiết lập theo yêu cầu của vị trí cố định
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)
Số lượng các mục không cố định, trên thực tế có thể khác nhau từ ~ 100 đến ~ 1000.
Điều tôi muốn đạt được là thực hiện truy vấn để trả lại các mục được sắp xếp theo trường date
có trường xem xét fixed_position
, viết tắt của trường như kết quả "ghim" vào các vị trí cụ thể. Nếu fixed_position
cho mục nhập đã cho không phải là NULL thì kết quả sẽ được ghim vào vị trí thứ n và nếu fixed_position
là NULL, thì ORDER BY
sẽ được ưu tiên.
đầu ra mong muốn của truy vấn cho lời giải thích sáng: giải pháp
(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`
Tôi đã thử posted in Ordering MySql results when having fixed position for some items nhưng ngay cả với phương pháp cắt-dán này dường như không làm việc ở tất cả.
Những gì tôi đã cố gắng này đến nay là truy vấn này:
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
nào trả về:
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
Liệu MySQL có thể thực hiện nhiệm vụ như vậy hay tôi nên áp dụng cách phụ trợ và thực hiện PHP array_merge()
trên hai bộ kết quả?
SQL bạn đang sử dụng là gì? Để chúng tôi có thể thấy những gì bạn đã thử. IE: 'sắp xếp theo ngày, ifnull (fixed_position, 0)' –
Tôi đã thêm truy vấn mẫu trong câu hỏi của mình. Đã dành hơn 5 giờ để tìm kiếm câu trả lời, kết thúc với hầu như không có gì. –
Trường 'fixed_position' có nằm trong bảng của bạn hay trường được tính toán không? –