Twój problem może być rozwiązany z czymś, co nazywa się funkcje okienkowe, ale MySQL nie obsługuje tej funkcji.
Mam dla ciebie dwa rozwiązania. Jedna jest symulacją funkcji okna, a druga jest typowym sposobem pisania zapytań, aby rozwiązać te sytuacje w MySQL.
Jest to pierwszy jeden, który mi odpowiedział this question:
-- simulates the window function
-- first_value(<col>) over(partition by user_id order by some_count DESC, time_start DESC)
SELECT
user_id,
substring_index(group_concat(time_start ORDER BY some_count DESC, time_start DESC), ',', 1) time_start,
substring_index(group_concat(some_count ORDER BY some_count DESC, time_start DESC), ',', 1) some_count
FROM foo
WHERE DATE(time_start) = '2016-07-27'
GROUP BY user_id
;
Zasadniczo, można grupować dane według user_id
i skleja wszystkie wartości z określonej kolumny przy użyciu ,
separator, zamówionej przez kolumny, które chcesz, dla każdej grupy, a następnie podciąga tylko pierwszą uporządkowaną wartość. Nie jest to optymalne podejście ...
A to druga, co odpowiedziałem this question:
SELECT
user_id,
some_count,
MAX(time_start) time_start
FROM foo outq
WHERE 1=1
AND DATE(time_start) = '2016-07-27'
AND NOT EXISTS
(
SELECT 1
FROM foo
WHERE 1=1
AND user_id = outq.user_id
AND some_count > outq.some_count
AND DATE(time_start) = DATE(outq.time_start)
)
GROUP BY
user_id,
some_count
;
Zasadniczo sprawdza podzapytanie dla każdego user_id
jeśli istnieją some_count
im wyższy był obecny jeden sprawdzane w tym dniu, ponieważ zapytanie główne oczekuje na NOT EXISTS
. Zostawisz wszystkie najwyższe wartości some_count
na user_id
w jednym dniu, ale dla tej samej najwyższej wartości od użytkownika może istnieć kilka różnych time_start
w tej dacie. Teraz wszystko jest proste. Możesz bezpiecznie GROUP BY
użytkownika i liczyć, ponieważ są one już dane, które chcesz, i uzyskać z grupy maksymalnie time_start
.
Tego rodzaju podzapytanie jest popularnym sposobem rozwiązywania takich problemów, jak w MySQL. Polecam wypróbować oba rozwiązania, ale wybierz drugi i zapamiętaj podkwerendę sintax, aby rozwiązać każdy przyszły problem.
Ponadto w MySQL stosuje się domyślnie ORDER BY <columns>
we wszystkich zapytaniach mających GROUP BY <columns>
. Jeśli nie zawracasz sobie głowy kolejnością wyników, możesz zapisać trochę przetwarzania, deklarując ORDER BY NULL
, co spowoduje wyłączenie funkcji niejawnego odwołania w zapytaniu.
SELECT DISTINCT (user_id), ... dostarczy Ci jeden wpis na użytkownika bez GROUP BY. Jaką kolumnę ma mieć wartość MAX()? – user3741598
Chcę, aby wartość MAX() dla 'some_count', ale także muszę znać MAX()' time_stop' dla gdzie ten konkretny 'some_count' pasuje ponieważ może być wiele wierszy gdzie' some_count' jest identyczne dla 'user_id 'i' time_stop' – randombits
Co to jest klucz podstawowy? –