2010-06-25 5 views
2

Как вы выполняете SQL-запрос для следующего условия? Предположим, у вас есть две таблицы: table1 и table2, где каждая запись в таблице1 может иметь несколько соответствующих записей в таблице2. Псевдо-код для запроса, что я хочу это:Запрос на запрос SQL-запроса

for each $row in table1 
    $rows = find all rows in table2 that corresponds to $row with $row.id == table2.foreign_id 
    # $rows is an array of corresponding row in table2 
    if all rows in $rows meet some condition 
    then 
    return $row 
    else 
    continue 
    end 
end 

EDIT: примечание в приведенном выше псевдокоде, я хочу только строки в table1, которая имеет все свои отношения в TABLE2, что соответствует некоторым условиям, а не только некоторые условия в таблице 1.

PS: Я хочу сделать это в SQL из-за проблем с эффективностью, которые могут возникнуть в противном случае.

Большое спасибо.

+0

Большое спасибо за информацию. Все еще новичок в этом веб-сайте. :) – fzhou

ответ

6

Вы можете переформулировать это с помощью предложения типа where not exists (..).

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

select * from customers c 
where not exists (
    select * from orders 
    where customerid=c.id 
     and status <> 'C' 
) 

Так вы просите для всех клиентов, которые не имеют неисполненных заказов - что то же самое, что все клиенты, чьи заказы все завершено.

Вместо:

if all rows in $rows meet some condition 

Вы говорите:

if NO rows in $rows DO NOT meet some condition 

Edit: Как было отмечено в комментариях, это будет также возвращать клиентов, которые не имеют заказов. Вы можете добавить and exists (select * from orders where customerid=c.id) в конец выше, чтобы исключить эти строки.

+0

Большое спасибо. Это фактический запрос, который я хочу. Я думаю, что «все строки в ...» - вот что делает его сложным. – fzhou

+1

Не так ли будет возвращать всех клиентов без заказов? – cjk

+0

@ck true; не уверен, будет ли это проблемой или нет. – Blorgbeard

4
select * from table1 as t1 
inner join table2 as t2 
    on t1.id == t2.foreign_id 
where -- some condition goes here 

Этот запрос возвращает только строки из таблицы1, имеющие соответствие в таблице2 и соответствующие условию where.

Я предлагаю проверить SQLCourse - Interactive Online SQL Training for Beginners, так как это действительно базовый SQL-запрос.

-2

общий формат:

SELECT * 
FROM Table1 t1 
    INNER JOIN Table2 t2 ON (t1.ID = t2.ID) 
WHERE ... 
0

Я думаю, что это то, что вы получаете в ... Вложенная выбора является производной таблицы с именем sub_query и соответствует этой части вам псевдо код ($ строки = найти все строки в таблице2, которые соответствуют $ row с $ row.id == table2.foreign_id). Внешний выбор позволяет дополнительно отфильтровать первую часть кода псевдо некоторым условием (ваш, если заявление)

select 
     sub_query.* 
    from 
     (select 
      * 
     from 
      table1, 
      table2 
     where 
      table1.id = table2.foreign_key_id) sub_query 
    where 
     sub_query.some_field = "some condition" 

Наслаждайтесь!

0

Как упомянуто ck, это действительно базовый sql.

для каждой строки в $ table1

SELECT table1.* FROM table1 

найти все строки в table2, что соответствует $ грести $ row.id == table2.foreign_id

LEFT JOIN table2 ON table1.id = table2.foreign_id 

, если все строки в $ строк отвечают некоторому условию

WHERE condition_here 

Весь SQL становится

SELECT 
    table1.* 
FROM table1 
    LEFT JOIN table2 ON table1.id = table2.foreign_id 
WHERE condition_here 
+0

Да, давайте рассмотрим все ответы, в которых упоминается, что это разрешено google, прежде чем спрашивать :) – simendsjo

0

Вот возможное решение. Я использую Oracle, не уверен, что синтаксис подходит именно для MySQL, но я думаю, вы можете работать с эквивалентом.

Идея этого состоит в том, чтобы найти все идентификаторы в таблице2, для которых все строки соответствуют желаемому условию, а затем найдите эти идентификаторы в таблице 1.

SELECT * 
    FROM table1 
    WHERE id IN (
    SELECT id 
     FROM table2 
     GROUP BY id 
     HAVING COUNT(*) = SUM(CASE WHEN <somecondition> THEN 1 ELSE 0 END) 
) 
Смежные вопросы