как получить записи в следующем сценарии - PullRequest
2 голосов
/ 22 декабря 2011

У меня есть таблица, как показано ниже:

node_name              id            term_name
----------------------------------------------
test1                  001           physics 
test1                  001           maths    
test1                  001           chemistry    
test2                  002           physics    
test2                  002           maths

Учитывая комбинацию имен терминов, я хочу найти все строки, где набор id содержит только точно заданные имена терминов.

Например, с учетом названия терминов физика и математика мои результаты должны быть такими, как показано ниже

node_name              id            term_name
----------------------------------------------
test2                  002           physics   
test2                  002           maths

Идентификатор набора 001 содержит также chemistry, поэтому его не следует включать.

Ответы [ 3 ]

1 голос
/ 22 декабря 2011

Ваш вопрос: получить все строки, в которых нет других строк с таким же идентификатором, кроме других term_names

SELECT * FROM <table> x WHERE
  term_name IN ('physics','maths') AND
  NOT EXISTS (SELECT * FROM <table> WHERE id=x.id AND term_name NOT IN ('physics','maths'))
0 голосов
/ 22 декабря 2011

Один из возможных способов сделать это:

select id, node_name 
from nodes join 
  (select id, 
       count(*) 
from nodes
  where node_name in ('physics','math')
group by id
having count(*) = 2 // this is set when generating the query ) as eligible_nodes
  on nodes.id = eligible_nodes.id
0 голосов
/ 22 декабря 2011

Прежде всего, вам нужно проанализировать ваш запрос для преобразования оператора '&' в SQL 'ИЛИ' в PHP:

//Parse the query
        $arr = explode('&',$query);
    $where = '';
//get the term count
    $count = count($arr);
    foreach($arr as $value){
    $where .= "term_name = '" . $value . "' OR";
    }
    //Remove last or
    $where = rtrim($where,'OR');

тогда: используйте L

"select node_name ,count(1) as Total from my table where $where
group by node_name
having Total =" . $count

Наконец:

Ваш запрос должен быть в следующем формате:

select x,count(1) as total from mytable where field1 = 'term1' or field1 = 'term2' having total = 2
...