[SQL]Verifier la presence d'une entrée dans plusieurs tables

WRInaute impliqué
Bonjour à tous

Etant donné que je ne suis pas très doué en SQL, je me tourne vers vous pour ma requette.
Je souhaite verifier si une entrée existe dans au moins une de mes tables. Pour cela il faut donc que je les verifie toutes.
Quelqu'un connaitrait il la syntaxe (même approchante) de ce genre de requette?

Merci à vous
 
WRInaute accro
Code:
SELECT `id` FROM `table1` WHERE (( `id` IN (SELECT `id` FROM `table2`) OR ( `id` IN (SELECT `id` FROM `table3`) OR ( `id` IN (SELECT `id` FROM `table4`)) AND `id`=$tavaleur

ptet qu'un truc comme ça ... (non garanti) et sans doute un peu lourd ...
 
WRInaute impliqué
hmm, ça me semble effectivement un peu tordu et un peu lourd. J'ai vu dans la doc SQL qu'il y avait une commande MATCH. J'essaye de comprendre comment elle marche mais j'avoue que pour l'instant je nage.

Mais y'a peut être un truc a creuser de ce coté là.
 
WRInaute accro
La recherche full text n'a rien avoir avec ce que tu veux faire. La requête de nickargall ne devrait pas être trop lourde puisqu'elle ne travaille quasiment que sur des indexes.

Tu peux même faire que des count(*) à la place, ça ira encore plus vite.

Exemple:

Code:
select "found" 
from (select count(*) as c1 from table1) as t1,(select count(*) as c2 from test2) as t2
WHERE c1 > 0 OR c2 > 0
 
WRInaute accro
:mrgreen:

Ca s'appelle une requête orthogonale. Ca veut dire que au lieu de faire un select from table, tu fais un select from (une résultat d'une table). Dans ce cas, je le fais sur deux résultats de tables comme si j'avais fait select * from table1,table2

J'affiche simplement found quand il trouve au moins 1 résultat dans la table t1 ou t2 grâce aux alias et aux conditions c1 > 0 OR c2 > 0

Donc quand tu fais ta requête, tu tests simplement si

if (mysql_fetch_assoc(mysql_query($requete)))
pour savoir s'il existe un résultat ou pas dans au moins une table.
 
WRInaute impliqué
Nickel, ça a l'air d'etre exactement ce dont j'ai besoin ;)

Donc en gros si je veux verifier la presence d'une variable, j'aurai c1=$ma_variable OR c2=$ma_variable ?
 
WRInaute accro
Eu non, moi j'ai compris ta question comme, existe-t-il une donnée (n'importe laquelle, j'ai compris un tuple) dans au moins une de mes tables ^^

Ça serait pour rechercher quoi ?

Surement un truc du genre:

Code:
select "found"
from (select count(*) as c1 from table1 where monchamp = $mavar) as t1,(select count(*) as c2 from test2 monchamp = $mavar) as t2
WHERE c1 > 0 OR c2 > 0
 
WRInaute impliqué
Ok, du coup ça me semble plus clair ;)

En fait je cherche à verifier l'existance de ma variable dans mes tables qui me génerent mes pages.

Pour l'instant si je passe dans l'url une variable non presente dans ma base, ça me genère tout de même une page, mais avec un grosse erreur php au milieu. Cette verif me permettrai de faire une petite 301 si la page demandé n'est pas "valide" ;)
 
WRInaute accro
Voui, ça devrait fonctionner ça non ? Tu saurais l'executer sur phpmyadmin pour voir le temps d'execution ? J'imagine que les champs à rechercher sont des "id" indexés ? Ca doit aller très vite tout ça !
 
WRInaute impliqué
Non justement ce ne sont pas des "id", mais mes bases ne sont pas lourdes (quelques centaines d'entrées au grand max). Je teste dans phpmyadmin pour voir le temps d'exe ;)

EDIT
apres test :

Affichage des enregistrements 0 - 0 (1 total, traitement: 0.0037 sec.)

ça va, c'est pas trop long :p
 
WRInaute impliqué
Je viens de mettre le script en place, ça fonctionne a merveille.
Par contre une question annexe. Si la page demandée n'existe pas, il vaut mieux une 301 vers la home, ou une 302 vers une page explicative ?
 
WRInaute passionné
Djoule_logo a dit:
Si la page demandée n'existe pas, il vaut mieux une 301 vers la home, ou une 302 vers une page explicative ?

Je mettrais plutôt une 404 personnalisée (après tout, ça sert justement à ça), avec éventuellement une redirection "html" au bout de 30 secondes vers la home.
 
WRInaute impliqué
J'ai pensé à la 404 au debut, mais je n'aime pas trop.
Le but de la manoeuvre étant aussi de ne pas perdre les BL "érronés".
 
Discussions similaires
Haut