LINUX.ORG.RU

MySQL выбрать записи не содержащиеся в другой таблице


0

1

Существует такая ситуация:

create table packs (
id bigint unsigned auto_increment primary key,
name varchar(255) not null
);
create table comps (
id bigint unsigned auto_increment primary key,
name varchar(255) not null
);

create table packs_comps(
pack_id bigint unsigned not null,
comp_id bigint unsigned not null
);

Т.е. packs_comps ассоциирует packs и comps. В ней pack_id и comp_id - FOREIGN KEYS.

Как выбрать из comps только те записи которые не ассоциированы с определённой comp_id в packs_comps.

Конечно можно пойти таким путём:

$fcs = array();
$q = mysql_query(
"SELECT pack_id FROM packs_comps WHERE comp_id = $cid"
);
while ($row = mysql_fetch_assoc($q)) {
$fcs[] = $row['pack_id'];
}
mysql_free_result($q);

$fcs = count($fcs) > 0 ? "WHERE id NOT IN (".join(',',$fcs).") : "";
$q = mysql_query(
"SELECT * FROM comps $fcs LIMIT $start, $limit"
);
while ($row = mysql_fetch_assoc($q)) {
..... (code to output records here) ............
}
mysql_free_result($q);

Однако я думаю MySQL имеет ограничение на максимальный размер строки запроса, хотя не знаю на сколько оно велико. И на сколько эффективно такое решение? Как реализовать данную задачу наиболее эффективно?

select * 
  from comps 
 where comp_id not in (select comp_id from packs_comps)
select * 
  from comps c 
 where not exists (select 1 
                     from packs_comps pc 
                    where pc.comp_id = c.comp_id)
aydar ★★★★★
()

еще вариант:

select * 
  from comps c
 where 0=(select COUNT(*) from packs_comps pc where pc.comp_id = c.comp_id)

nu11 ★★★★★
()

select c.* from comps c
left join packs_comps pc on pc.comp_id = c.id
where pc.comp_id is null

это ж простая вещь, вы че. или я чего-то не понимаю в условии задачи?

heisenberg ★★
()
Ответ на: комментарий от pi11

мой запрос вернет записи из таблицы comps, для которых отсутствуют соответствующие записи в таблице packs_comps. left join же. либо условие задачи было не в этом, либо ошибаетесь все же вы.

heisenberg ★★
()
Ответ на: комментарий от heisenberg

>left join packs_comps pc on pc.comp_id = c.id

where pc.comp_id is null

Какой join будет на поле содержащем Null?

pi11 ★★★★★
()
Ответ на: комментарий от heisenberg

Хотя да, извиняюсь ошибся, left join же.

pi11 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.