8791 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Je bloque sur une requête.

J'ai une colonne `username` dans la table `1`
et une colonne `username` dans la table `2`

Comment obtenir la liste des username de t1 qui ne sont pas dans t2 ?

Merci de votre aide.
Je ne sais pas quel SGBD tu utilises mais essaye :

SELECT username
FROM `1`
WHERE `2`.username NOT IN (SELECT username FROM `2`);

ou

SELECT username
FROM `1`
EXCEPT
SELECT username
FROM `2`;

ou

SELECT username
FROM `1`
MINUS
SELECT username
FROM `2`;
Il y a surement plus simple mais comme ça vite fait je ferais comme ça :

1 : lecture de la ligne 1 de la table 1 et affichage dans la colonne 1 d'un tableau
2 : lecture de la ligne 1 de la table 2
Là deux possibilités :
2.1 : je compare et c'est le même nom
2.1.1 : j'affiche dans la colonne2 du tableau
2.1.2 : je peux lire la ligne 2 de la table 2

2.2 : je compare et le nom est différent
2.2.1 : j'affiche un blanc dans la colonne2 du tableau
2.2.2 : je continue de lire la ligne 1 de la table 2

3 : lecture de la ligne 2 de la table 1
4 : lecture de la ligne 1 (ou 2 suivant la lecture de la ligne précédente.) de la table 2

Au final on se retrouve donc avec un tableau contenant tes valeurs identiques ou des blancs tant que les valeurs sont différentes.
Il faut aussi vérifier le nombre de lignes de tes tables. Si tu es au bout d'un côté il y a peut être d'autres valeurs sur l'autre table.
adrien881 a écrit :
Je ne sais pas quel SGBD tu utilises mais essaye :

SELECT username
FROM `1`
WHERE `2`.username NOT IN (SELECT username FROM `2`);

ou

SELECT username
FROM `1`
EXCEPT
SELECT username
FROM `2`;

ou

SELECT username
FROM `1`
MINUS
SELECT username
FROM `2`;


Merci de ta réponse mais ça ne marche pas.
Je suis en mysql 5.
J'ai essayé ça
SELECT username
FROM `1`
WHERE `2`.username NOT IN (SELECT username FROM `2`);

J'obtiens le message d'erreur suivant :
#1054 - Unknown column '2.username' in 'IN/ALL/ANY subquery'
Bilgor Le Rouge a écrit :
Il y a surement plus simple mais comme ça vite fait je ferais comme ça :

1 : lecture de la ligne 1 de la table 1 et affichage dans la colonne 1 d'un tableau
2 : lecture de la ligne 1 de la table 2
Là deux possibilités :
2.1 : je compare et c'est le même nom
2.1.1 : j'affiche dans la colonne2 du tableau
2.1.2 : je peux lire la ligne 2 de la table 2

2.2 : je compare et le nom est différent
2.2.1 : j'affiche un blanc dans la colonne2 du tableau
2.2.2 : je continue de lire la ligne 1 de la table 2

3 : lecture de la ligne 2 de la table 1
4 : lecture de la ligne 1 (ou 2 suivant la lecture de la ligne précédente.) de la table 2

Au final on se retrouve donc avec un tableau contenant tes valeurs identiques ou des blancs tant que les valeurs sont différentes.
Il faut aussi vérifier le nombre de lignes de tes tables. Si tu es au bout d'un côté il y a peut être d'autres valeurs sur l'autre table.


Merci de ton aide mais la difficulté pour moi est d'utiliser les bons opérateurs pour la comparaison des chaînes de caractère. La logique de la requête me paraît très simple (peut-être même plus simple que ce que tu décris Smiley cligne )
et ben on va dire que chercher n'est pas ton fort... et la compréhension des erreurs non plus !!

SELECT username
FROM `1`
WHERE username NOT IN (SELECT username FROM `2`);

devrait tout simplement fonctionner

l'erreur te dit que la colonne 2.username n'existe pas dans la table , ce qui est normal puisque dans la table 2, comme la table 1, tu as username et pas 2.username
Merci de ton aide mais j'obtiens maintenant le message d'erreur suivant:
#1267 - Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '='