2009-11-03 6 views
0

SOLVED - voir ci-dessous BishBeaucoup de nombreuses tables et l'interrogation sur la même variable avec des tableaux

J'ai une liste de cases à cocher qui déversent tous fruitid $ [], et un grand nombre à plusieurs Tableau 1:

BoxID FruitID 
01  01 
01  02 
02  01 
02  03 
02  04 
03  02 
etc.  etc. 

Je veux un utilisateur de cocher la case à côté de chaque fruit qu'ils veulent, puis la requête pour tirer vers le haut une liste de chaque boîte qui contient tous les fruits sélectionnés (et d'autres fruits est ok , c'est une exigence minimale et non une recherche de contenu exacte).

Mon PHP fonctionne bien, mais je suis déconcerté par ce que je pensais être une chaîne MySQL facile. En gros, si je

SELECT boxid FROM table1 WHERE fruitid=$fruitid1 AND fruitid=$fruitid2 AND etc. 

jusqu'à ce que toutes les données vérifiées sont entrées je me retrouve avec aucun résultat, car aucune ligne UNIQUE contient plus d'un fruitid. Est-ce logique? La seule solution à laquelle je peux penser est un groupe d'instructions select imbriquées, chacune réduisant le pool de résultats du sous-ensemble précédent jusqu'à ce que vous ayez recherché toutes les valeurs dans le tableau original. Cela semble à la fois intense et encombrant à coder.

Y a-t-il un meilleur moyen?

+0

Grumdrig posté d'abord (par 48 sec), puis édité pour inclure ma réponse. Utiliser OU ou IN vous donnerait les mêmes résultats. Mais on dirait que vous cherchez quelque chose de différent. – NitroxDM

+0

@NitroxDM Le vôtre est apparu pendant que j'étais en train d'éditer. Aucune intention de balayer; voici une upvote pour vous. – Grumdrig

+0

@Grumdrig pas de soucis. ;) – NitroxDM

Répondre

1

Sur la base des suggestions actuelles, vous devriez être en mesure d'obtenir ce que vous cherchez en ajoutant simplement GROUP BY et HAVING:

SELECT boxid FROM table1 WHERE fruitid IN ($fruitid1, $fruitid2, ...) GROUP BY boxid HAVING COUNT(*) = $selectedFruitCount; 

en regroupant par boxid et en ajoutant le COUNT(), vous obtenez le nombre de fruits « intéressants » que chaque boîte contient. Si ce nombre est égal au nombre total de fruits sélectionnés, cette case doit contenir chacun des fruits sélectionnés (et éventuellement plus). Gardez à l'esprit que cela suppose que la combinaison de boxid et fruitid est unique.

+0

Je faisais simplement une promenade en pensant que l'incorporation d'un certain nombre de filtrerait les boîtes retournées contenant moins que tous les fruits désirés, mais ne savais pas comment le coder. Cela ressemble à une mise en œuvre propre de mes pensées impures, et je vais essayer dès que possible. Merci, je vous le ferai savoir! – Drew

+0

Je n'arrive pas à faire fonctionner ça dans la boîte de phpMyAdmin SQL, je continue à recevoir des erreurs, mais je suis assez confiant que je pourrais le faire en deux étapes (# 1 - select _ from _ where _ in _ // # 2 filtre de compte) en PHP. Malheureusement, je ne serai pas capable de l'essayer jusqu'à ce que je rentre à la maison ce soir. Je vous le ferai savoir. – Drew

+0

Il serait bon d'autoriser la clause HAVING à effectuer le filtrage à l'étape 2 pour vous. Sans voir les erreurs que vous obtenez, je ne peux pas fournir beaucoup de conseils en dehors de vérifier la documentation MySQL pour la syntaxe SELECT pour la version que vous exécutez. J'ai fait un test rapide qui a bien fonctionné sur 4.1.22. – bish

1

Si vous changez vos AND en OR, je pense que vous feriez ce que vous essayez de faire. Conceptuellement, lisez la sélection comme "sélectionner des lignes avec à la fois la propriété1 ET la propriété2 ET ...", pas "sélectionner les lignes avec la propriété1 ET aussi les lignes avec la propriété2, etc."

EDIT: Plus vous pouvez utiliser de manière compacte

SELECT boxid FROM table1 WHERE fruitid IN ($fruitid1,$fruitid2,...) 
+0

Bel exemple! ;) – NitroxDM

+0

s'il vous plaît voir des données supplémentaires dans la question d'origine – Drew

1

Vous voudrez peut-être repenser votre base de données (ou je ne sais pas ce que vous essayez). Mais à partir du SQL que vous avez publié il semble que vous pourriez faire quelque chose comme ceci:

SELECT boxid FROM table1 WHERE fruitid in ($fruitid1,$fruitid2); 
+0

s'il vous plaît voir des données supplémentaires dans la question d'origine – Drew

+0

@Andrew Heath - Pourriez-vous fournir d'autres exemples de ce que vous voulez?Si la table a deux colonnes (BoxID, FruitID) et a les données que vous avez posté ci-dessus et $ fruitid1 = 01 et $ fruitid2 = 02. Ensuite, vous obtiendrez trois lignes. BoxID - 01 02 03 – NitroxDM

+0

La requête que je veux ne retournerait pas BoxIDs 2 et 3 parce que ni l'un ni l'autre n'ont les deux valeurs. Ce n'est pas une recherche __ OU __, c'est une requête ___ ET ___, ce qui est la partie délicate. – Drew

1
SELECT boxid FROM table1 
WHERE fruitid IN ($fruitid1, $fruitid2,) 

Pouvez-vous donner plus d'explications sur ce que vous voulez. D'après votre question, j'ai compris que cela devrait fonctionner.

Questions connexes