2017-03-10 2 views
0

j'ai une requête qui retourne 7 enregistrements:CFQUERY où la comparaison de clause Regrouper les résultats

<cfquery name="equip" datasource="#datasource#"> 
select equipment_id from service_ticket 
where equipment_id > 0 
</cfquery> 

je puis prendre ces résultats et l'utilisation d'exécuter une autre requête à nouveau les:

<cfquery name="get_equipment_tally" datasource="#datasource#"> 
select * 
from equipment_maintenance 
where active = "yes" AND id <> #equip.equipment_id# 
</cfquery> 

Mais la requête « get_equipment_tally "compare seulement 'id' au premier enregistrement de mes résultats de requête" equip "dans la clause where, même s'il y a sept enregistrements retournés.

Y a-t-il un moyen de contourner cela?

+0

Votre observation de 'ne fait que comparer' id 'au premier enregistrement 'est le comportement par défaut lorsque vous ne spécifiez pas de numéro de ligne. –

Répondre

2
AND id NOT IN <cfqueryparam cfsqltype="cf_sql_integer" 
    value="#valueList(equip.equipment_id)#" list="true"> 

Idéalement vous transformer cela en une seule requête si

<cfquery name="get_equipment_tally" datasource="#datasource#"> 
select * 
from equipment_maintenance 
where active = "yes" AND id NOT IN (select equipment_id from service_ticket where equipment_id > 0) 
</cfquery> 
+0

Cela a fonctionné parfaitement, merci! Je n'avais aucune idée que vous spécifiiez une requête comme celle de la clause where. –

+1

SQL a une tonne de flexibilité, en cas de doute, essayez-le et voyez ce qui se passe. –

+0

@BrianFleishman - FWIW, il s'agit d'une [sous-requête] (https://dev.mysql.com/doc/refman/5.7/fr/subqueries.html). Vous pouvez également obtenir le même résultat avec [EXISTS] (https://dev.mysql.com/doc/refman/5.7/en/exists-and-not-exists-subqueries.html). Il y a [avantages et inconvénients pour chacun] (http://stackoverflow.com/questions/25756112/mysql-exists-vs-in-correlated-subquery-vs-subquery) en fonction de la requête exacte, des index, etc. ([EXPLAIN] (https://dev.mysql.com/doc/refman/5.7/en/explain.html) est pratique si vous faites des comparaisons) – Leigh

0

J'aime ces réponses, mais en voyant PAS dans une requête me donne des tics. Utilisez une jointure gauche gauche ... IS NULL à la place. Ce sera BEAUCOUP plus rapide.

SELECT <list of cols here> 
FROM equipment_maintenance em 
LEFT OUTER JOIN equipment_id ei ON ei.equipment_id = em.equipment_id 
WHERE em.Active = 'yes' 
AND ei.equipment_id IS NULL 

Quelque chose comme ça.