/ / Pourquoi ne puis-je pas utiliser des n-uplets ou des paires ordonnées dans une sous-requête dans MySQL? - mysql, sous-requête, tuples

Pourquoi ne puis-je pas utiliser des tuples ou des paires ordonnées dans une sous-requête de MySQL? - mysql, sous-requête, tuples

Supposons que je souhaite obtenir la ligne la plus récente d'une table contenant plusieurs enregistrements ayant des identifiants différents.

Tout d'abord, je crée une table temporaire dans laquelle je trouve les lignes les plus récentes (regroupées par ID bien sûr):

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

Mais, comme tout le but était d'obtenir toutes les valeurs de ces enregistrements, je dois joindre cela à la table d'origine, atable. Ennuyeux, mais que pouvez-vous faire.

Je veux vraiment, vraiment utiliser un tuple ou une paire d'ordre. Pourquoi ne puis-je pas faire cela dans MySQL?

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

Quelle est la syntaxe canonique pour faire cela?

(En outre, question philosophique: pourquoi MySQL est-il si maladroit avec cela? Cela fait des décennies et personne n'a jamais implémenté quelque chose d'aussi basique?)

Réponses:

0 pour la réponse № 1

Pourquoi ne puis-je pas faire cela dans MySQL?

Vous pouvez, mais pas avec IN. La façon de faire correspondre plusieurs colonnes est avec EXISTS:

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

Notez que vous pouvez également utiliser votre requête d'origine en tant que sous-requête:

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

Pourquoi MySQL est-il si maladroit avec cela?

L’utilisation "standard" de IN est de rechercher des enregistrements où une valeur est contenue dans une liste d’autres valeurs (par ex. WHERE NAME IN ("Smith", "Jones"). Cela a été étendu pour permettre à une sous-requête de fournir la liste plutôt qu'une liste statique.

Si vous estimez que cette fonctionnalité mérite d’être mise en œuvre par MySQL (et vous semblez penser que c’est très facile), vous pouvez envoyer un demande de fonctionnalité, mais puisque 1) il existe un autre moyen de le réaliser et 2) ce serait du code SQL non standard. Je serais surpris qu’il suscite beaucoup d’attention.