2017-02-09 11 views
0

1.) Я хочу запросить, какие идентификаторы fk_pathway содержат все 3 идентификатора fk_link (101,51,87). В этом примере результат будет Тропинка ID 2 и Тропинка ID 3.Сложный запрос с несколькими значениями ячеек (по строкам) в качестве условия?

2.) Я хочу, чтобы запрос, который fk_pathway Идентификаторы содержат все 3 fk_link идентификаторов (101,51,87) в порядке возрастания. В этом примере результат будет Тропинка ID 3.

запрос должен быть возможен с любым числом fk_link идентификаторов, так что я мог бы получить родительский fk_pathway идентификаторы тысяч fk_link идентификаторов.

Возможно ли это с помощью MySql? Если это не так, есть ли какая-то другая форма хранения данных, совместимая с php, где я мог бы делать такие запросы?

Упрощенная версия данных:

fk_link | fk_pathway | order 
     101 1   1 
     51 1   2 

     101 2   1 
     87 2   2 
     51 2   3 
     29 2   4   

     11 3   1 
     101 3   2 
     51 3   3 
     87 3   4 
     97 3   5 
+0

И вы пробовали ...? – SuperDJ

+0

Если у вас есть несколько вопросов, вы должны опубликовать их отдельно. –

ответ

1

Если вы хотите получить fk_pathway, которые имеют все три fk_link с, использование:

select 
    fk_pathway 
from your_table 
group by 
    fk_pathway 
where fk_link in (101,51,87) 
having count(distinct fk_link) = 3 

Если вы хотите получить высокий fk_pathway, который имеет все три fk_link s, использование:

select 
    fk_pathway 
from your_table 
group by 
    fk_pathway 
where fk_link in (101,51,87) 
having count(distinct fk_link) = 3 
order by fk_pathway desc 
limit 1 
1

На первую часть ответил GurV.

Для второй части вам также необходимо проверить, есть ли порядок 101 < заказать 51 < заказать 87, для fk_pathway. Для этого добавьте условия сравнения в предложении having.

select fk_pathway 
from your_table 
group by fk_pathway 
having count(distinct case when fk_link in (101,51,87) then fk_link end) = 3 
and max(case when fk_link=101 then order end) < max(case when fk_link=51 then order end) 
and max(case when fk_link=51 then order end) < max(case when fk_link=87 then order end)