/ / Dlaczego nie mogę używać krotek lub uporządkowanych par w podzapytaniu w MySQL? - mysql, podzapytanie, krotki

Dlaczego nie mogę używać krotek lub uporządkowanych par w podzapytaniu w MySQL? - mysql, podzapytanie, krotki

Powiedzmy, że chcę uzyskać najnowszy wiersz w tabeli zawierającej kilka rekordów z różnymi identyfikatorami.

Najpierw tworzę tabelę tymczasową, w której znajduję najnowsze wiersze (pogrupowane według ID):

CREATE TEMPORARY TABLE
temp1
AS
SELECT DISTINCT ID, max(date) FROM atable GROUP BY ID;

Ale ponieważ chodziło o to, aby uzyskać wszystkie wartości dla tych rekordów, muszę dołączyć do tego z powrotem do oryginalnego stołu, atable. Irytujące, ale co możesz zrobić.

Naprawdę, naprawdę chcę użyć pary krotek lub pary zamówień. Dlaczego nie mogę tego zrobić w MySQL?

SELECT * FROM atable
WHERE (ID, date) IN
(SELECT ID, date FROM temp1);

Jaka jest składnia kanoniczna, aby to zrobić?

(Co więcej, pytanie filozoficzne: dlaczego MySQL jest tak niezgrabny z tym? To już od dziesięcioleci i nikt nigdy nie zaimplementował czegoś tak podstawowego?)

Odpowiedzi:

0 dla odpowiedzi № 1

Dlaczego nie mogę tego zrobić w MySQL?

Możesz, ale nie z IN. Sposobem na dopasowanie wielu kolumn jest EXISTS:

SELECT * FROM atable
WHERE EXISTS
(SELECT NULL FROM temp1
WHERE temp1.ID = atable.ID AND temp1.date = atable.date);

Zauważ, że możesz również użyć pierwotnego zapytania jako podzapytania:

SELECT * FROM atable
WHERE date = (SELECT max(date) FROM atable WHERE ID = atable.ID)

Dlaczego MySQL jest tak nieporęczny?

"Standardowe" użycie IN jest znalezienie rekordów, w których jedna wartość znajduje się na liście innych wartości (np. WHERE NAME IN ("Smith", "Jones"). Zostało to rozszerzone, aby umożliwić podzapytanie, aby dostarczyć listę zamiast listy statycznej.

Jeśli uważasz, że jest to warta funkcja do zaimplementowania MySQL (i wydaje ci się, że to bardzo łatwe), możesz przesłać żądanie funkcji, ale od 1) jest inny sposób, aby to osiągnąć i 2) byłby to niestandardowy SQL Byłbym zaskoczony, gdyby miał dużo uwagi.