deux tables, un array

Eléphant du PHP | 58 Messages

05 mai 2013, 13:51

Bonjour.

J'aimerais écrire une requête qui me donne les résultats classés dans un certain ordre, mais issus de deux tables différentes. Dans l'une j'ai des planètes, dans l'autres des disques de poussières, je veux les classer par ordre de distance par rapport au soleil (axis croissant).

Comment écrire cette requete? La deuxième table n'étant pas encore crée, comment dois-je la designer par rapport à la table des planètes pour simplifier la chose?

Merci d'avance.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

05 mai 2013, 17:52

salut,


Cela dépend de comment tu peux décrire tes élements.
si les planetes et disques ont des éléments similaire tu peux très bien utiliser la même table avec un champs 'type' qui indiquera s'il s'agit de l'un ou de l'autre

par exemple

create table typelement(
idtype int not null primary key,
nomtype varchar(50)
);

create table elements (
idelement int not null primary key,
idtype int null,
nom varchar(100) not null,
distance double
);
alter table elements add constraint fk_type foreign key(idtype) references typelement(idtype);
du coup la reque
ête est assez simple
select * from elements
join typelment using(idtype)
order by distance;-- ASC / DESC suivant ce qui t'intéresse

Dans tous les cas
il faut modéliser la bases avant de penser à l'affichage :)

Par exemple tu peux imaginer un système plus complexe avec une table element juste une clef primaire, un nom et un type.
Une table qui contient la descriptions des différentes caractéristique (taille, couleur, les choses aux quelles je ne songe pas).
une table qui va réunir les deux premières.
une table qui va contenir les distance entre les différents élements. (idelement 1, idelement 2, distance) du coup le select ressemble au mieux sauf que le tu ajoute un prédicat (where) sur l'un des elements == la clef primaire de la terre.
L'avantage de cette table (utilisable dans mon 1ère exemple) c'est que tu peux stocker les distances entres les élements quelqu'ils soient :)


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 58 Messages

05 mai 2013, 20:11

Le truc c'est que les disques de débris et les planètes sont des objets très différents, alors j'aurais préféré faire deux tables. J'y avais pensé, mais justement j'aimerais l'éviter.

Il n'y a pas moyen de faire quelque chose comme ça?
SELECT (liste) FROM planetes AND disques 
WHERE star_name=nom_étoile
ORDER BY axis
J'avais essayé quelque chose de cette forme il y a quelques temps mais ça me donnait des erreurs ou des résultats vides.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

05 mai 2013, 23:39

si tu fait un select directement sur deux tables tu risque le produit cartésien et donc des données incohérentes.

Après tu peux tenter l'union entre deux requêtes avec une order by sur la distance


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 58 Messages

07 mai 2013, 13:50

Bonjour.

Je viens d'essayer la méthode UNION qui m'avait l'air intéressante. Malheureusement ça ne marche pas. Voici ma requete:
$req_planet_gen="
				(SELECT name,type, sudarsky_class FROM  `exoplanets` WHERE star='".$star_name."' )
				UNION
				(SELECT name,type, sudarsky_class FROM  `discs` WHERE star='".$star_name."' )
				
				ORDER BY axis
				";