2016-08-26 3 views
0

Ich habe ein Problem mit meiner SQL-Abfrage. Ich habe Job-Tabelle und job_feature. Nun hat jeder Job-Objekt hat viele FeatureMYSQL Abfrage für mehr Bedingung

Beispiel: Job 1 hat Merkmal 1, 2, 9. So, jetzt muss ich diese Abfrage: Select job has feature (1 or 2) and 9. Advanced. Select job has feature (1 or 2 or 3) and (9 or 10) und ... wenn diese Abfrage mit

SELECT * 
FROM `m_job` as job 
JOIN `d_job_feature` as jf ON job.id= jf.job_id 
WHERE (jf.feature_id = 1 OR jf.feature_id = 2) 
AND jf.feature_id = 9; 

=> Rückkehr leere Daten

So, jetzt, wie kann ich diese Daten SQL für die Suche verwenden. Danke!

Antwort

2

Das Problem mit Ihrer Abfrage ist die feature_id für eine bestimmte Zeile kann nicht 1 oder 2 und auch 9 entsprechen. Stattdessen müssen Sie Ihre Funktionen mit group by gruppieren. Dann können Sie condition aggregation verwenden, um zu sehen, ob für ein bestimmtes Merkmal beide Bedingungen existieren können.

Hier ist eine Option exists:

select * 
from m_job as m 
where exists (
    select 1 
    from d_job_feature as d 
    where m.id=d.job_id 
    group by d.job_id 
    having max(case when d.feature_id in (1,2,3) then 1 else 0 end) = 1 and 
      max(case when d.feature_id in (9,10) then 1 else 0 end) = 1 
) 
+0

Ehrfürchtig, es ist Arbeit perfekt. Danke, Mist. – dungphanxuan

1

Was ist, wenn Sie zwei Join-Abfragen?

SELECT * 
FROM (
    SElECT`m_job` as job 
JOIN `d_job_feature` as jf ON job.id= jf.job_id 
WHERE jf.feature_id in(1,2,3) 
) as t1 INNER JOIN 
(
SELECT job.id 
FROM `m_job` as job 
JOIN `d_job_feature` as jf ON job.id= jf.job_id 
WHERE jf.feature_id IN (9,10) 
) as t2 ON t2.id ==t1.id 
+0

Danke Rio, ich folge @sgeddes und es funktioniert perfekt. Meine Datenbank hat mehr Funktionen. Beispiel zur Abfrage 'Job auswählen hat Feature (1 oder 2 oder 3) und (9 oder 10) UND (12 oder 15) ...'. wenn Sie diese Abfrage verwenden, so ist es sehr komplex – dungphanxuan

+1

kein Problem. Ich hätte nie gedacht, es wie @sgeddes zu machen. liebe neue Dinge zu lernen! Viel Glück – Rio