Существует такая ситуация:
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 имеет ограничение на максимальный размер строки запроса, хотя не знаю на сколько оно велико. И на сколько эффективно такое решение? Как реализовать данную задачу наиболее эффективно?