Qui sera capable de résoudre ma requête ? :)

Qui sera capable de résoudre ma requête ? :) - SQL/NoSQL - Programmation

Marsh Posté le 08-10-2005 à 16:32:05    

J'ai 2 tables sur mysql :
 
- table1 avec différents champs dont 'categories' dont la valeur peut par exemple être "jeux, video, telechargement, news"
- table2 qui contient la liste des categories, à savoir "jeux", "video", "telechargement", "news".
 
Je voudrais faire un menu tout en haut d'une page avec la liste des catégories. Le problème c'est que toutes les catégories n'ont pas forcement un enregistrement associé.
 
Exemple concret : dans la table1, j'ai :
- "VIDEO1" > "jeux, telechargement, video"
- "JEUX3" > "jeux, telechargement"
- "VIDEO4" > "telechargement, video"
 
Je voudrais donc qu'en haut de ma page, il y ait un menu avec "Jeux", "Telechargement", "Video".. mais pas "news" puisqu'aucun enregistrement n'est associé..
 
Problème : Comment construire ma reqûete SQL qui va construire le menu ?? J'ai pensé à une requête imbriqué du style :

Code :
  1. SELECT abbreviation,nom_complet
  2. FROM categorie
  3. WHERE (SELECT count(id) FROM video WHERE categories=abbreviation) <> 0
  4. ORDER BY nom_complet


 
Mais ça ne marche pas... Merci pour votre aide !
 

Reply

Marsh Posté le 08-10-2005 à 16:32:05   

Reply

Marsh Posté le 08-10-2005 à 18:10:35    

Quel SGBD ? Quelle version ?
 
Sous SQL Server, Oracle, mySql récent, etc. :
 

Code :
  1. SELECT abbreviation, nom_complet
  2. FROM categorie c
  3. WHERE EXISTS (SELECT 1 FROM video WHERE categories = c.abbreviation)
  4. ORDER BY nom_complet;


 
Sous mySql plus ancien :
 

Code :
  1. SELECT DISTINCT abbreviation, nom_complet
  2. FROM categorie c
  3. LEFT JOIN video v ON v.categories = c.abbreviation
  4. WHERE v.categories IS NULL
  5. ORDER BY nom_complet;

Reply

Marsh Posté le 08-10-2005 à 18:12:35    

C'est sur Mysql 4, donc ça serait plus :
 
SELECT abbreviation, nom_complet  
FROM categorie c  
WHERE EXISTS (SELECT 1 FROM video WHERE categories LIKE '%'+c.abbreviation+'%')  
ORDER BY nom_complet;

Reply

Marsh Posté le 08-10-2005 à 18:13:48    

ou alors :
 
SELECT DISTINCT abbreviation, nom_complet  
FROM categorie c  
LEFT JOIN video v ON v.categories LIKE '%'.abbreviation.'%'  
WHERE v.categories IS NULL  
ORDER BY nom_complet;
 
??

Reply

Marsh Posté le 10-10-2005 à 17:22:00    

Euh... Y'as pas une couille dans ta modélisation ? Il manque clairement une table de correspondance entre tes deux tables.
 
Il ne faut JAMAIS utiliser de champs contenant une liste.
 
Fait donc :
 
TABLE1
id
nom
 
TABLE2
cat_id
nom
 
TABLE3
id_table1
cat_id
 
Et ça contient :
 
TABLE1 :
1 VIDEO1
2 JEUX3
3 VIDEO4
 
TABLE2 :
1 jeux
2 video
3 telechargement
4 news
 
TABLE3 :
1 1
1 2
1 3
2 1
2 3
3 2
3 3
 
Ainsi, tu fais la bête requête :
 

Code :
  1. select distinct table2.nom
  2. from table2, table3
  3. where table2.cat_id = table3.cat_id


 
(et tu te passes de TABLE1 dans ta requête, car on a suffisamment d'infos dans TABLE3)


Message édité par Arjuna le 10-10-2005 à 17:23:26
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed