2013-02-27 2 views
0

je suis arrivé la requête suivante:MySQL attributs de recherche (Strict)

SELECT  SQL_CALC_FOUND_ROWS u.unit_id, u.unit_serial_full, u.unit_status, u.contract_id, u.warehouse_id, 
      m.model_name, 
      c.contract_name, 
      t.transfer_id, 
      w.warehouse_name_full 
FROM  units AS u 
LEFT JOIN models AS m ON m.model_id = u.model_id 
LEFT JOIN contracts AS c ON c.contract_id = u.contract_id 
LEFT JOIN transfers AS t ON t.transfer_id = u.transfer_id 
LEFT JOIN warehouses AS w ON w.warehouse_id = u.warehouse_id 
LEFT JOIN units_attributes AS ua ON ua.unit_id = u.unit_id 
WHERE  1 
     AND u.company_id = :company_id 
     AND (
       (
        u.model_id = "4" 
       AND (
         ua.attribute_id = :attribute_id_0 AND attribute_default = :attribute_value_0 
        ) 
       AND (
         ua.attribute_id = :attribute_id_1 AND attribute_default = :attribute_value_1 
        ) 
       ) 
      ) 

Si je recherche avec 2 attributs ou plus, il donne aucun résultat, mais si je ne dispose que 1 attribut, les travaux de recherche comme prévu. Des idées ?

La recherche doit être stricte. Pas avec wildcard.

Merci.

Répondre

0

Eh bien, ua.attribute_id ne peut pas être deux valeurs à la fois

(
    ua.attribute_id = :attribute_id_0 AND attribute_default = :attribute_value_0 
) 
AND (
    ua.attribute_id = :attribute_id_1 AND attribute_default = :attribute_value_1 
) 
+0

que j'ai compris, la question est comment ça peut être? –

+0

Eh bien, vous pouvez utiliser une condition OU –

+0

L'OR permettra à 1 unité d'avoir 1 valeur et l'autre unité d'avoir une valeur mais elles ne partageront pas 2, 3 ou 4 valeurs d'attribut similaires. –

0
SELECT  SQL_CALC_FOUND_ROWS u.unit_id, u.unit_serial_full, u.unit_status, u.contract_id, u.warehouse_id, m.model_name, c.contract_name, t.transfer_id, w.warehouse_name_full 
FROM  units AS u 
LEFT JOIN models AS m ON m.model_id = u.model_id 
LEFT JOIN contracts AS c ON c.contract_id = u.contract_id 
LEFT JOIN transfers AS t ON t.transfer_id = u.transfer_id 
LEFT JOIN warehouses AS w ON w.warehouse_id = u.warehouse_id 
LEFT JOIN units_attributes AS ua ON ua.unit_id = u.unit_id 
WHERE 1 = 1 
    AND u.company_id = :company_id 
    AND u.model_id = "4" 
    AND ua.attribute_id IN (:attribute_id_0, :attribute_id_1) 
    AND attribute_default IN (:attribute_value_0, :attribute_value_1) 
+0

Ceci donne le même résultat qu'un OR –

0

Une colonne ne peut pas avoir en même temps deux valeurs différentes. Par conséquent, un filtre tel que ua.attribute_id = :foo AND ua.attribute_id = :bar entraîne une clause Impossible WHERE.

La meilleure solution est généralement groupe vos résultats et filtrer les groupes résultants pour que ceux qui contiennent des documents répondant à vos critères, à savoir en utilisant la clause HAVING:

GROUP BY col1, col2, col3 
HAVING SUM(ua.attribute_id = :foo) AND SUM(ua.attribute_id = :bar) 
+0

Avez-vous un exemple avec la clause 'HAVING'? Merci. Je filtrerais en utilisant PHP mais le problème est que je ne veux pas tirer tous les attributs pour chaque unité. –

+0

@ DavidBélanger: J'ai ajouté un exemple ... mais comme je ne connais pas les colonnes sur lesquelles vous devriez regrouper, il est difficile de donner une réponse exacte. Au pire, je suppose que vous pourriez regrouper toutes les colonnes de la liste de sélection. – eggyal

+0

Je vais essayer de comprendre moi-même. Merci pour l'exemple. Pour référence, attribut_id est l'ID dans attribute_default est la valeur à rechercher. –