2013-05-01 3 views
0

У меня возникли проблемы с пониманием как написать конкретный запрос MySQL для выполнения реляционного деления/пересечения. Я рассмотрел следующие ссылки/вопросы SO, но я все еще запутался:Как написать конкретный запрос MySQL для выполнения реляционного деления/пересечения? Id est, какой запрос я пишу?

MySQL equivalent of IN() clause doing Logical AND; Relational Algebra : Division; Divided we Stand; Advanced SQL : Intersect; Doing INTERSECT and MINUS in MySQL и Alternative to INTERSECT in MySQL

Я попытался адаптировать SQL-запрос, показанный в «Альтернативе INTERSECT в MySQL», но потерялся в реализации.

ПСЕВДОКОД:

Want : package.* from package WHERE package.pkid equalto package_products.pkid AND package_products.pid is_all_of (
    WANT : option_products.pid FROM option_products 
    WHERE option_products.oid = [optionID] 
), // returning packages that have all of the product IDs (pids) and not just one of them. 
[OptionID] = $option 

MySQL (внутри db_query():

"SELECT package.* FROM package WHERE package.pkid = package_products.pkid && package_products.pid is_allof(". 
    // What do I use in place of 'is_all_of'? How do I do an intersection/ relational division with INNER JOIN and/ or USING(pid)? 
" SELECT options_products.pid FROM options_products WHERE options_products.oid = :option 
)", array(":option" => $option) 

ответ

0

Может быть, я что-то пропустил, но я бы сказал, что

db_query("SELECT package.* FROM package 
WHERE package.pkid = package_products.pkid 
&& package_products.pid IN 
(SELECT options_products.pid FROM options_products 
WHERE options_products.oid = %d)", $option)); 

должен работать на вас.

Я переписал ваш синтаксис для удовлетворения требований Drupal 6 db_query (http://api.drupal.org/api/drupal/includes!database.mysql-common.inc/function/db_query/6).

+0

IN - условие ИЛИ (является одним из). То, что мне нужно, - это условие AND (это все). –