a partir de mysql 5 tu peux utiliser les requetes imbriquées.
Version imprimable
a partir de mysql 5 tu peux utiliser les requetes imbriquées.
En faite, je me tâte à savoir si je continue comme ça ou si je revois le système des checkbox.
Parce que à la limite je met des <select> avec un attribut name attribué par une variable incrémenté ($i++).
Ensuite, je récupère les noms des select avec une boucle pour voir si le select est bien envoyé.
C'est quand meme cette foutue requete qui me pose problème, je la retourne dans tous les sens, ça fonctionne ... pas au final.
Les tables sont mals foutues alors ? doit y avoir plus simple.
Si quelqu'un pouvait m'éclairer ...
alors comme a dit Yanika_bzh, joint ton MCD, comme ça on pourra t'aider un peu plus car c'est pas facile pour nous de visualiser toute ton appli sans ça.
merci ;)
Y a aucun problème.
Mais comme je le dis plus haut, j'arrive pas à utiliser DBdesigner.
Donnez-moi le nom d'un logiciel simple et facile d'accès, et je vous fais un drop de ma base.
Je suis toujours bloqué, et croyez moi ça n'est pas de la mauvaise foi.
Un coup de paluche serait le bienvenue ... tous les Juilletiste sont partis ?
Salut,
Essaye de nous faire un MCD ou quelque-chose qui puisse nous aider à voir comment est architecturé ton appli. Tu peux peut etre regarder du coté de visio ou au pire fait un truc sous un logiciel de dessin.
;)
Bon je vais essayer de faire remonter le topic.
J'ai vraiment pas laché l'affaire mais j'ai dut trouver une solution alternative.
J'ai donc mis un select au lieu de checkbox.
Le client peut donc maintenant uniquement choisir un seul et unique filtre.
Le problème c'est que quand il choisit plusieurs filtres tout part en vrille.
Je vais donc devoir vous dessiner les tables essentiels.
Voila la base :
<!-- Retirer -->
Les tables pour les options sont art_options, art_options_values, art_options_to_products
J'ai pas réussi à mettre les liaisons.
J'espère que vous pourrez m'aider, ça fait un bail que je suis dessus quand meme.
Merci ;)
Juste avant de m'y plonger entierement dedans, si ta requete avec un seul filtre fonctionne, est ce que tu ne peux pas faire une jointure entre la requete avec le filtre 1 et la requete avec le filtre 2 ?
Concretement ça donnerait quoi ?
Dit comme ça, ça saute pas aux yeux ...
ben en fait imaginons que l'utilisateur ne choisisse qu'un filtre (par exemple un filtre sur la forme)
la tu fais ta requete en recherchant les produits ayant cette forme. Cette requete fonctionne déja apparemment car tu es arrivé à faire ta requete avec un seul filtre.
Maintenant si l'utilisateur selectionne la matiere teck et la forme ovale.
dans ce cas tu fais une requete sur la forme ovale puis une autre requete sur la matiere teck et au résultat tu prends ce que tu as en commun.
tu vois ou je veux en venir ?
Sinon petite question annexe, la forme du produit c'est ce que tu stockes dans language_id ?
Le problème, c'est que ça va me retourner tous les produits en forme ovale et d'un autre coté tous les produits en teck. Le même resultat qu'avec IN precedemment.Citation:
dans ce cas tu fais une requete sur la forme ovale puis une autre requete sur la matiere teck et au résultat tu prends ce que tu as en commun.
Alors que moi, je voudrais uniquement avoir les produits en forme ovale teck.
Le language_id, c'est un champ int ou je stocke l'ID de la langue.
C'est dans values_name (table art_options_values) que je stock les valeurs des options
Alors il faut qu'on revoit la structure de ta requete.Citation:
Le problème, c'est que ça va me retourner tous les produits en forme ovale et d'un autre coté tous les produits en teck. Le même resultat qu'avec IN precedemment.
J'ai repris ta requete select en rajoutant des parentheses. Essaye pour voir si ça marche.
Sinon, étant donné que je suis pas fort en php tu peux commenter les commandes de ta requete svp. (le implode fait quoi exactement et il récupère quoi ?)
courage ;)Code:
1
2
3
4
5
6
7
8
9
10
11
12 SELECT DISTINCT " . $column . " FROM (((PRODUCTS p INNER JOIN PRODUCTS pd ON (p.products_id = pd.products_id AND pd.language_id = '" . (int)$language->getID() . "')) INNER JOIN PRODUCTS_TO_CATEGORIES p2c ON (pd.products_id = p2c.products_id)) INNER JOIN OPTIONS_TO_PRODUCTS o2p ON (p2c.products_id = o2p.products_id AND p2c.categories_id = '" . (int)$category_id . "')) WHERE o2p.products_id IN (" . implode(', ', $_SESSION['listing_data']) . ")";
Ah ouais quand même.
Donne-moi juste les directives, ne te tracasse à faire toi-même le code.
C'est pas à toi de te faire chi** à faire tout le truc.
Donc en faite dans le code de test, j'ai des checkbox avec comme identifiant filter[]
je récupère ensuite le $_POST['filter'] qui me retourne un tableau contenant tous les values_id (table : art_options_values)
j'enregistre ça dans une session pour le garder au fil de la navigation
$_SESSION['listing_data'] = $_POST['filter']
A la fin j'utilise la fonction implode, pour aligner tous les ID du tableau : *
ça va me retourner par exemple : 30, 40, 50Code:implode(', ', $_SESSION['listing_data'])
ça reste en beta test, après j'améliorai le code pour tout faire passer en $_GET.
Pour le moment, ma préoccupation c'est le code pour accéder à la base et me retourner les résultats.
Dans le cas de ta requete, j'ai plus rien !
mysql_num_rows me retourne 0
Alors deux choses :Code:
1
2
3
4
5
6
7
8
9
10
11
12 SELECT DISTINCT " . $column . " FROM (((PRODUCTS p INNER JOIN PRODUCTS pd ON (p.products_id = pd.products_id AND pd.language_id = '" . (int)$language->getID() . "')) INNER JOIN PRODUCTS_TO_CATEGORIES p2c ON (pd.products_id = p2c.products_id)) INNER JOIN OPTIONS_TO_PRODUCTS o2p ON (p2c.products_id = o2p.products_id AND p2c.categories_id = '" . (int)$category_id . "')) WHERE o2p.products_id IN (" . implode(', ', $_SESSION['listing_data']) . ")";
c'est pas $language->getID() mais $osC_Language->getID()
$category_id mais $current_category_id
et c'est pas o2p.products_id IN mais o2p.values_id.
Tu as dut te tromper lorsque tu as récopié !
J'ai des résultats
[Edit]
J'en reviens au début donc ...
Je choisis le filtre matière teck et forme du plateau carrée
et j'obtiens ce que j'avais dit plus haut : les produits tables basses carrés et les produits tables basses teck (mais avec le plateau en form carrée, rectangulaire, ovale)
Retour à la case départ.
Donc ton site est multilingue ? (de toute façon ça change rien mais c'est juste pour valider ce que je comprend)Citation:
Le language_id, c'est un champ int ou je stocke l'ID de la langue.
Donc quand tu parles d'options ça peut etre la forme, la matiere ou la collection. toutes ces options sont dans la meme table c'est ça ?Citation:
C'est dans values_name (table art_options_values) que je stock les valeurs des options
Sinon sur le principe tu peux essayer de decomposer ta requete avec une sous requete.
Mais d'abord verifie bien que cette requete te renvoie bien ce que tu veux
ensuite tu peux essayer de faire ça:Code:
1
2
3 SELECT products_id FROM OPTIONS_TO_PRODUCTS o2p WHERE o2p.products_id IN (" . implode(', ', $_SESSION['listing_data'])
si ça marche pas tu peux repartir de le premiere requete que tu as tester et essayer de restreindre de plus en plus la jointire en verifiant ce que tu optiens. Du debogage quoi ;)Code:
1
2
3
4
5
6
7
8
9
10 SELECT DISTINCT " . $column . " FROM PRODUCTS p INNER JOIN PRODUCTS pd ON (p.products_id = pd.products_id AND pd.language_id = '" . (int)$language->getID() . "') WHERE p.product_id IN SELECT product_id FROM PRODUCTS_TO_CATEGORIES p2c INNER JOIN OPTIONS_TO_PRODUCTS o2p ON (p2c.products_id = o2p.products_id AND p2c.categories_id = '" . (int)$category_id . "')) WHERE o2p.products_id IN (" . implode(', ', $_SESSION['listing_data']) ")";
j'espere que ça t'aidera