Moteur de recherche pour base mysql

Mammouth du PHP | 19672 Messages

10 juil. 2005, 12:40

Je reprends donc l'explication. Supposons la requête suivante:

Code : Tout sélectionner

SELECT t1.champ1, t2.champ2, t3.champ3 FROM table_1 t1, table_2 t2, table_3 t3 WHERE t1.id = t2.id_t1 AND td.id = t3.id_t2
On pourrait l'écrire de la manière suivante plus classique:

Code : Tout sélectionner

SELECT table_1.champ1, table_2.champ2, table_3.champ3 FROM table_1, table_2, table_3 WHERE table_1.id = table_2.id_t1 AND table_2.id = table_3.id_t2
Tu obtiendras très exactement le même résultat. L'alias est utilisé pour raccourcir l'écriture du code et plus les requêtes sont longues et complexes, plus c'est pratique.

Dans la première version, le moteur SQL va aller chercher dans la clause FROM à quoi correspond tel ou tel alias pour pointer sur la bonne table. La seconde version n'utilise pas du tout les alias mais directement les noms complets des tables.

Si ça ne répond pas à ta question, alors c'est que ta question est mal formulée et que j'ai compris autre chose que ce que tu demandais en réalité.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 174 Messages

10 juil. 2005, 12:52

si ça répond à ma question mais je comprenais pas comment un alias pouvais etre par la base de donnée, voilà.

Mammouth du PHP | 19672 Messages

10 juil. 2005, 12:57

Excellent. Ceci posé, sais-tu pourquoi on doit parfois préfixer le nom d'un champ par le nom de la table ?

Ensuite, reprenons également ton problème de base. Tu en es où en fin de compte ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 174 Messages

10 juil. 2005, 16:03

Je suppose que quand tu as plusieurs tables à relier sur ta table principale via son id_champ (ici pour moi concours_id) tu dois préfixer.
Mais ma réponse ne dois pas être très claire :roll:

Pour répondre à ta deuxième question j'en suis encore au début de ma
requête au liaison entre les champs et les tables.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

10 juil. 2005, 16:16

tu dois préfixer quand tu utilises un champ nommé pareil dans deux tables différentes

exemple : tu veux relier les tables "concours" et "concours_bande", tu le fais sur le champ "id_concours"
problème : le sgbd ne peut savoir tout seul de quel champ "id_concours" tu parles, celui de "concours" ou de "concours_bande" ?

donc on fait préfixe

Code : Tout sélectionner

SELECT * FROM concours c, concours_bande c_b WHERE c.id_concours = c_b.id_concours
et voilà, le cham est identifié ;)

Invité
Invité n'ayant pas de compte PHPfrance

10 juil. 2005, 19:25

Est ce possible avec INER JOIN ? (jointure)
si oui, pouvez vous me faire un exemple ?
(j'aimerais bien connaitre le inner join)

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

10 juil. 2005, 20:02

Est ce possible avec INER JOIN ? (jointure)
si oui, pouvez vous me faire un exemple ?
(j'aimerais bien connaitre le inner join)
quelle est la question ?
est-ce que tu peux préfixer un champ avec INNER JOIN ? oui bien sûr, tu peux préfixer avec ce que tu veux

tu veux connaitre INNER JOIN ? pour ça regarde la doc, celle de l'Altruiste résume bien la chose :
INNER JOIN (option par défaut) indique toutes les paires correspondantes des lignes renvoyées et supprime les lignes n'ayant pas de correspondance entre les deux tables.
donc sauf erreur de ma part (et quelqu'un corrigera), ceci :

Code : Tout sélectionner

SELECT c.id_concours FROM concours c, concours_bande c_b WHERE c.id_concours = c_b.id_concours
est l'équivalent de :

Code : Tout sélectionner

SELECT c.id_concours FROM concours c INNER JOIN concours_bande c_b ON c.id_concours = c_b.id_concours
mais ici on peut t'aider sur des problèmes précis, ou si tu as des questions
mais le meilleur moyen d'apprendre les bases, c'est la doc, les sites webs, les exemples et les essais

tu regardes la documentation d'une commande, les exemples, puis tu essais sur des tables à toi jusqu'à ce que ça te sorte le résultat désiré

si tu as des difficultés et que vraiment tu ne comprends pas, alors tu peux poster une question

mais sinon on ne peut pas faire un cours via le forum, c'est pas adapté et ce sera long et compliqué

bon courage ;)

Eléphant du PHP | 174 Messages

11 juil. 2005, 10:51

Code : Tout sélectionner

SELECT c.nom, c.date, b.bande, m.mode FROM concours c, bandes b, modes m, concours_bande c_b, concours_mode c_m WHERE concours_bande, concours_mode WHERE bande LIKE '$variable%'" WHERE c.id_concours = c_b.id_concours AND c_b.id_bande = b.id_bande AND c.id_concours = c_m.id_concours AND c_m.id_mode = b.id_mode AND (b.bande LIKE '$variable%' OR c.date LIKE '$variable%' OR m.mode LIKE '$variable%');
j'ai remplacé $variable% par une donnée enregistré sur la base
et j'ai cette erreur :
  • #1064 - Erreur de syntaxe pr�s de ' concours_mode WHERE bande LIKE '80m'
    WHERE c.id_concours = c_b' � la ligne 3

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

11 juil. 2005, 10:55

tu as 3 WHERE dans ta requête...

j'ai l'impression que tu t'attaques à une montagne sans savoir grimper une colline ;)
donc reprends un peu les bases, essaye par exemple de faire une recherche sur 1 critère, puis 2... le reste viendra plus facilement

Eléphant du PHP | 174 Messages

11 juil. 2005, 11:06

je n'est fais que reprendre ton ancien post comme modele voir post precedent page 2 :?

OK je vais suivre tes conseils

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

11 juil. 2005, 11:09

c'est exact, et bien j'ai du avoir le copier/coller hatif, toutes mes excuses :oops:

donc : un seul WHERE dans une requête :)

mais bon, ça reste valable, commence par associer 2 critères, c'est plus facile de débugger une requête avec deux critères qu'avec 4 ;)

Eléphant du PHP | 174 Messages

11 juil. 2005, 17:48

Bon je viens de tester cette requette sous phpmyadmin
et je n'est pas d'erreur :
Par contre peut on m'expliquer ce quelle fait exactement ? :wink:

Code : Tout sélectionner

SELECT concours.nom, concours.date, bandes.bande, modes.mode FROM concours, bandes, modes WHERE 'concours.id_concours' = 'bandes.id_concours' AND 'concours.id_concours' = 'modes.id_concours'

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

11 juil. 2005, 18:03

Code : Tout sélectionner

SELECT FROM concours, bandes, modes WHERE 'concours.id_concours' = 'bandes.id_concours' AND 'concours.id_concours' = 'modes.id_concours'
si je me rappelle bien ta structure de base, tu n'as pas de champ "id_concours" dans les tables "bandes" et "modes"
c'est étonnant que ça marche :roll:

un exemple plus parlant :

Code : Tout sélectionner

SELECT id_concours, nom, mode FROM concours c, concours_mode c_m, modes m WHERE c.id_concours = c_m.id_concours AND c_m.id_mode = m.id_mode
cette requête sélectionne le numéro et le nom de chaque concours, et le libellé du mode correspondant au numéro du mode enregistré dans "concours"

en liant chaque ligne de "concours" à la table "modes", via "concours_mode"

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

11 juil. 2005, 18:05

je viens de comprendre pourquoi ta requête marche

Code : Tout sélectionner

SELECT concours.nom, concours.date, bandes.bande, modes.mode FROM concours, bandes, modes WHERE 'concours.id_concours' = 'bandes.id_concours' AND 'concours.id_concours' = 'modes.id_concours'
tu as mis des quotes autour des noms de colones, ce qui fait que MySQL ne traite plus des colonnes, mais des chaines de caractères
à mon avis, cette requête ne provoque pas d'erreur, mais ne renvoie rien n'est-ce pas ?

normal : tu as le droit de comparer 'concours.id_concours' et 'bandes.id_concours', mais ces chaines ne sont pas identiques ;)

quand il s'agit d'un nom de colonne ou de table : pas de quotes, ni de guillemets

Eléphant du PHP | 174 Messages

11 juil. 2005, 18:32

Tout à afit pour ta précédente question concernant les quotes.

C'est deux code fonctionne en séparé
comment faire pour les associés et en faire qu'un ?

Code : Tout sélectionner

SELECT c.id_concours FROM concours c, concours_bande c_b WHERE c.id_concours = c_b.id_concours SELECT c.id_concours FROM concours c, concours_mode c_m WHERE c.id_concours = c_m.id_concours
et après tout celà je n'est plus qu'à ajouter la clause LIKE '$mot_cle%' normalement.

Avec la chaleur il y a des neuronnes qui rentrent en fusion :lol:
PS : je n'est fait que relier les tables j'ai encore tout faux

tu pourrais me donner les étapes à suivre, je te donne un exemple :
1° - relier les tables entre elle avec select where
2° - séléctionner les champs pour la requete de recherche
3° - rechercher avec LIKE