Как получить записи в следующем сценарии
У меня есть таблица, как показано ниже:
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 ответа
Ваш вопрос: получить все строки, где нет других строк с таким же идентификатором, кроме других 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'))
Прежде всего, вам нужно проанализировать ваш запрос, чтобы преобразовать оператор "&" в 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
Один из возможных способов сделать это:
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