2009-09-25 3 views
0

Это трудно объяснить, но мне нужномножественного выбора в одном операторе

- select id from customers 
- foreach customer find the order with that id 
-- foreach order (for that customer) 
--- select product.name, product.max on order.productId=product.id 

Я не знаю, как вытащить эти данные. Мне нужно несколько отдельных выборок? могу ли я написать длинный одиночный оператор sql (';' считается отдельным: P). Как вытащить вложенные строки из строки ......

+1

Я хотел бы попробовать JOIN и, но дать некоторые таблицы схемы, чтобы мы знали бы –

ответ

4

Использования присоединяется:

SELECT c.id, o.id, p.name, p.max 
    FROM Customers AS c 
     JOIN Orders AS o ON c.id = o.customer 
     JOIN Product AS p ON o.productID = p.id 

Скорее всего, у вас есть таблица Orders и таблица ТоварыЗаказа - просто добавить дополнительный уровень РЕГИСТРИРУЙТЕСЬ с соответствующие условия.

Обратите внимание, что я полагаю, что ваша таблица - это «Заказы», ​​чтобы избежать конфликта с ключевым словом «ЗАКАЗ». Я не предполагал, что вы устранили Product.Max из функции MAX. Возможно, вам придется беспокоиться о том, что позволяет ваша СУБД (некоторые из них терпимы к злоупотреблению ключевыми словами, а некоторые нет).


Терпимое (более толерантных) СУБД IBM Informix Dynamic Server (IDS):

CREATE TABLE table(null INTEGER, integer CHAR(3), date DECIMAL(10,0), decimal DATE); 

Он работает - это ужасно. Но это позволяет избежать многих проблем с ключевыми словами, добавленными позже.

+0

Все базы данных SQL разрешить использование ключевых слов в качестве идентификаторов, если заключите их в ограничители, которые двойные кавычки в стандарте или обратно -ticks в MySQL или квадратные скобки в MS SQL Server. –

+0

Да - согласовано (теоретически). IDS разрешает оператор CREATE TABLE как написанный (а не двойную кавычку) и требует настройки (переменной среды, установленной в клиентской среде) для приема идентификаторов с разделителями. Таковы капризы реального мира. (Продукты предшественника IDS допускали двойные кавычки как эквивалентные одинарным кавычкам - примерно в то время, когда SQL-86 был стандартизован; я не уверен, были ли SQL-86 или SQL-89 или SQL-92 стандартизованными идентификаторами с разделителями, но по причинам обратной совместимости ...). –

0

То, что вы получите в одном составном запросе, является повторяющимися значениями полей для единственного конца отношения «один ко многим». Так что, если Foo: Bar :: 1: много тогда как запрос, который получает все бары и их Foos возвращает что-то вроде:

foo1 bar1 
foo1 bar2 
foo1 bar3 
foo2 bar4 
foo2 bar17 
foo3 bar78 

Если вы добавляете в другой таблице Баз, который Bar: Баз :: 1: много, то вы получите что-то вроде этого:

foo1 bar1 baz1 
foo1 bar1 baz2 
foo1 bar1 baz3 
foo1 bar2 baz15 
foo1 bar3 baz32 
foo1 bar3 baz33 
foo2 bar4 baz17 
foo2 bar17 baz21 
foo3 bar78 baz7 

Это именно то, что должен делать SQL. Но это представляет собой небольшую проблему, когда вы пытаетесь вывести ответ в симпатичном формате. Вот где код вашего приложения входит. Установите держатель $ равным полю foo и проверьте, отличается ли новый foo от старого на каждом проходе через ваш цикл. Сделайте то же самое с $ bar. Итак:

$fooholder=NULL; 
$barholder=NULL; 
foreach ($result as $row_array) { 
    if(empty($fooholder)) { 
    $fooholder=$row_array['foo']; 
    $barholder=$row_array['bar']; 
    } 

    if ($fooholder!=$row_array['foo']){ //new foo value, so next section 
    //output $row_array['foo'] since it's new 
    $fooholder=$row_array['foo']; 
    } 

    if ($barholder!=$row_array['bar']){ //new bar value, so next section 
    //output $row_array['bar'] since it's new 
    $barholder=$row_array['bar']; 
    } 

    //output $row_array['baz'] 

} 
Смежные вопросы