Page 1 sur 1

Requette avec UNION et DISTINCT

Posté : 16 avr. 2006, 01:41
par Nico128
Salut tout le monde !

J'explique déja ce que je suis en train de faire : C'est un systeme de news avec 4 catégorie.
- News console de Salon
- News console Portable
- News Economique
- News Concurence

Ya donc 4 tables dans ma base de donné et qui ont les meme champs.

Quand on ajoute une news, il est possible de les classer dans plusieurs catégorie. Donc elles seront enregistrer dans plusieurs tables.

Après j'aimerais faire la liste de toutes les news classé par date. Le problème c'est que celles qui sont enregistrer dans plusieurs tables s'afficheront plusieurs fois.
$sql = "(SELECT * FROM news_salon)
		UNION 
		(SELECT * FROM news_portable)
		UNION 
		(SELECT * FROM news_concurence)
		UNION 
		(SELECT * FROM news_economie)
		UNION 
		(SELECT * FROM news_concurence)
		ORDER BY date_news DESC";
Alors je me dit "pas de soucis je vais glisser un DISTINCT". Voilà ce que ça donne :
$sql = "(SELECT titre,date_news FROM news_salon)
		UNION DISTINCT
		(SELECT titre,date_news FROM news_portable)
		UNION DISTINCT
		(SELECT titre,date_news FROM news_concurence)
		UNION DISTINCT
		(SELECT titre,date_news FROM news_economie)
		UNION DISTINCT
		(SELECT titre,date_news FROM news_concurence)
		ORDER BY date_news DESC LIMIT 6";
Là tout marche, j'ai bien tous les titre qui sont différent qui s'affiche. Mais alors ou est le problème ? Enfaite j'ai besoin de récupéré aussi l'id de la news, mais si je rajoute "id" a SELECT ça ne va pas marcher puisque les news qui sont plusieurs fois non pas le meme id...

Je sais pas si vous comprenez la chose...

En clair, j'aimerais pouvoir tous selectioner les news, mais que celles qui ont un titre différent.

Je viens d'y penser maintenant, chui con, j'aurais pu stocker tout dans la meme table et mettre les 4 champs, ça aurait éré beaucoup plus simple ^^

Voila...merci d'avance :D

Re: Requette avec UNION et DISTINCT

Posté : 16 avr. 2006, 02:01
par Truc
Salut,
Ya donc 4 tables dans ma base de donné et qui ont les meme champs.
Tout de suite Défaut de modélisation de la base.
On ne crée pas 4 tables ayant exactement les memes champs.

Il te faudra 3 tables pour ce que tu veux faire, une pour les news une pour les types de news et une dernière qui fait le lien entre les 2 tables.

Même problème ICI.

Posté : 16 avr. 2006, 02:21
par Nico128
J'ai pas tout compris ce qu'il aimerais faire, c'est difficil de comprendre quelque chose quand c'est pas nous qui l'avons fait (donc j'ouvre une parenthèse pour vous remercier, j'ai toujours pu résoudre mon problème sur ce forum, merci a vous tous :D ).

Mais si il faut changer la structure des table alors il serait pas mieux de faire :

Code : Tout sélectionner

Table News: - id (auto_increment) - titre - texte - date - news_salon - news_portable - news_concurence - news_economie
Après les 4 champs news_ je les mettrais en tinyint(1).

Posté : 16 avr. 2006, 12:57
par Truc
non tu peut te retrouver avec des champs inutilisés.

Regarde ce post (même si ce n'est pas ton problème :wink: ) le principe est exactement le même.

Posté : 16 avr. 2006, 13:04
par momox
Fait un champ de catégorie dont le type est ENUM('news_salon','news_portable','news_concurrence','news_economie')
C'est beacoup plus simple a gérer...
@+

Posté : 16 avr. 2006, 23:06
par Nico128
non tu peut te retrouver avec des champs inutilisés.

Regarde ce post (même si ce n'est pas ton problème :wink: ) le principe est exactement le même.
Et ça fais quoi si il y a des champs vide ? Ils seront pas vide, mais justre mis à 0

Sinon pour lien que tu ma passé jai essayer de comprendre, mais hum hum lol, jessayerai plus tard de lire le poste en entier.

Sinon j'ai jamais utilisé ENUM ça marche comment pour entré les donné et les ressortir ? (Et ou il faut placer les 4 possibilité quand on créé le champ ?)

Posté : 17 avr. 2006, 00:37
par Truc
Et ça fais quoi si il y a des champs vide ? Ils seront pas vide, mais justre mis à 0
oui mais inutilisés pour certains champs, 0 est considéré comme inutilisé dans ce cas.

Tu ne peux utiliser le type enum puisqu'une news peux faire partie de plusieurs types. Faudrai donc enregistrer 2 fois voire plus la news avec les mêmes données en changer le champ type. Ce qui nous ramène sur une mauvaise organisation.

Je vais reprendre l'exemple de Cyrano dans l'autre post:

Code : Tout sélectionner

Table Relation Table +------------------+ +-----------------+ +---------------------+ | table News | | table New_typ | | table Type | +------------+-----+ +-------+---------+ +---------------+-----+ | Champ | Cle | | Champ | Cle | | Champ | Cle | +------------+-----+ +-------+---------+ +---------------+-----+ | new_id | PRI |-----------|new_id | ETR PRI |-----------| typ_id | PRI | | new_titre | | |typ_id | ETR PRI | | typ_Salon | | | new_date | | +-------+---------+ | typ_Portable | | +------------+-----| | typ_Economique| | | typ_Concurence| | +---------------+-----+
les requetes seront les mêmes avec ces noms de champ

Posté : 17 avr. 2006, 02:56
par Nico128
Houlà mais c'est assez compliqué :shock: J'arrive toujours pas a comprendre...Ca fais maintenant 10mn que je reste sur ce tableau, cherchant a comprendre comment ça marche, enfin comment faudra inséré depuis mon formulaire après ? Dans le champ "Type" il faudra y inséré quoi ?

Puré :shock:

Je crois plutot que je vais faire comme j'avais pensé au début, faire qu'une seule table parce que la...

Mais je comprend pas pourquoi il faut pas qu'un champ soit nul ? Qu'est-ce que ça va engendrer ?

Posté : 17 avr. 2006, 09:40
par Cyrano
Explication de ce schéma : on va monter ce système si "À une news peuvent correspondre 0 à n Types" et dans le même temps "Un Type peut faire référence à 0 à n News"

En structurant avec deux tables et une relation, tu évites les champs avec des valeurs NULL.

Le requêtes seront des jointures, c'est à dire que tu pourras récupérer toutes les news d'un type particulier, ou tous les types rattachés à une news en particulier, exemple :
-1- Toutes les news d'un type:

Code : Tout sélectionner

SELECT new_titre, new_date FROM News AS n, New_typ AS nt, Type AS t WHERE n.new_id = nt.new_id AND nt.typ_id = t.typ_id AND t.typ_id = 123;
-2- Tous les types se référant à une news spécifique:

Code : Tout sélectionner

SELECT typ_Salon, typ_Portable, typ_Economique, typ_Concurrence FROM Type AS t, New_typ AS nt, News AS s WHERE t.typ_id = nt.typ_id AND nt.new_id - n.new_id AND n.new_id = 456;
Saisis-tu meux le principe de ce fonctionnement ?

Posté : 17 avr. 2006, 16:20
par Nico128
Euh oui et non. J'ai compris la requette, mais pas le

Code : Tout sélectionner

AND t.typ_id = 123;
D'ou viens ce 123 ? De meme pour la 2em requete 456 ? Ta pris des exemple je pense, mais je comprend pas ça quand même.

Dans la table "News" et "New_typ" je sais quoi y inséré, mais dans la table "Type" j'insère quoi ?

Et sinon je sais pas si ta répondu ma question mais il me semble pas, mais ou est le problème si un champ est NULL ? Des champs NULL on en trouve partout, mais pourquoi il faut éviter alors ?

Merci d'avance

Posté : 17 avr. 2006, 18:03
par Truc
Euh oui et non. J'ai compris la requette, mais pas le

Code : Tout sélectionner

AND t.typ_id = 123;
D'ou viens ce 123 ? De meme pour la 2em requete 456 ? Ta pris des exemple je pense
Exact, juste des exemple pour que tu puisses tester. Au lieu de ces valeurs saisie des valeurs a toi qui existent dans la table et tu vera le résultat.
Dans la table "News" et "New_typ" je sais quoi y inséré, mais dans la table "Type" j'insère quoi ?
Cette table tu n'y touche jamais, juste à la création. tu insert les 4 enregistrements qui correspondent aux types de news et puis c'est tout. Par la suite elle te sert juste pour retrouver le nom d'un type donné.[/quote]

C'est pas la mort d'avoir des champs null dans une table mais tant que possible on évite car souvent cela représente une mauvaise modélisation.

Posté : 17 avr. 2006, 20:06
par Nico128
Merci j'irai tester juste après qu'on m'est répondu a ma dernière (jespère) question :

Dans la table "Type" j'entre 4 enregistrements de base, mais j'écrit quoi ?

Jai fait un tableau et j'ai mis des "??" où je ne savait pas quoi mettre quand je devais inséré des enregistrement

Image

Posté : 17 avr. 2006, 21:51
par Truc
Bah, je me suis encore une fois gouré dans mes explications #-o
l'heure était tardive :lol:

tu dois juste avoir 2 champs dans cette table "TYPE"

champ 1 => typ_id
champ 2 => typ_nom

Tu aura donc 4 enregistrements:

Code : Tout sélectionner

typ_id nom 1 Salon 2 Portable 3 Economique 4 Concurence

Posté : 18 avr. 2006, 01:29
par Nico128
Ahhh okey lol ! C'est vrai que maintenant je comprend nettement mieux.

Je vais essayé de mettre tout ça en pratique, je vous retient au courant si j'arrive pas à faire quelque chose. :P