2014-02-18 5 views
0

Исходя из строки в таблице AI необходимо получить строку в таблице B, которая получает строку в таблице C. С моими основными знаниями я помещаю запрос в запрос в запросе, но я предполагаю есть лучший способ сделать это?Объединение 3 SQL-запросов в 1

<?php $result = pg_query($dbconn, " 
    SELECT sequence, w_homepage_package_id        
    FROM adempiere.w_homepage_package 
    WHERE sequence > 0 
    ORDER BY sequence ASC 
    "); // first QUERY 
    while ($promo = pg_fetch_row($result)) { // first WHILE 
     $id = $promo[1];  
     $produktfoto = pg_query($dbconn, " 
     SELECT w_bilder_id 
     FROM adempiere.w_homepage_image 
     WHERE w_homepage_package_id = $id LIMIT 1"); // second QUERY 
     while ($produktrow = pg_fetch_row($produktfoto)) { // second WHILE 
      $bilderid = $produktrow[0]; 
      $bildurl = pg_query($dbconn, " 
      SELECT w_bildurl 
      FROM adempiere.w_bilder 
      WHERE w_bilder_id = $bilderid LIMIT 1"); // third QUERY 
      while ($bildpfad = pg_fetch_row($bildurl)) { // third WHILE 
       echo $bildpfad[0]; 
      } 
     } 
    ;}         
    ?> 
+0

использование присоединиться. проверьте http://www.w3schools.com/sql/sql_join.asp – ripa

ответ

1

Это должно быть правильным левое соединение запрос (если я ничего не забыл)

SELECT * 
FROM adempiere.w_homepage_package 
     LEFT JOIN adempiere.w_homepage_image 
      ON adempiere.w_homepage_package.w_homepage_package_id = adempiere.w_homepage_image.w_homepage_package_id 
     LEFT JOIN adempiere.w_bilder 
      ON adempiere.w_homepage_image.w_bilder_id = adempiere.w_bilder.w_bilder_id 
WHERE sequence > 0 
ORDER BY sequence ASC 

Чтобы понять JOIN, подумайте о декарте продукта:

Table1 
f1 f2 
---------- 
a 1 
b 4 
c 5 

Table2 
f3 f4 
---------- 
a aa 
b cc 

f1 f2 f3 f4 
-------------------------- 
a 1 a aa 
a 1 b cc 
b 4 a aa 
b 4 b cc 
c 5 

Table1 LEFT JOIN Table2 ON f1 = f3 

a 1 a aa 
b 4 b cc 
c 5 

Table1 INNER JOIN Table2 ON f1 = f3 
a 1 a aa 
b 4 b cc 

Есть хороший пример на wikypedia http://en.wikipedia.org/wiki/Join_(SQL)

+0

Я видел один «строитель» вместо «bilder» и один e, отсутствующий на adempiere, но в любом случае он возвращает: Query failed: ERROR: column w_homepage_image.w_hompage_package_id не существует LINE 4: ... mage ON adempiere.w_homepage_package.sequence = adempiere ....^в – user2164882

+0

последнее редактирование: – TlmaK0

+0

Еще 2 опечатки (adempier, hompage), но он работает сейчас. Я постараюсь это понять. Благодаря! – user2164882

1

Подзапросы или соединения. Вы можете объединить три таблицы в относительном столбце или вложить их до достижения первой таблицы.

SELECT w_bildurl 
FROM adempiere.w_bilder 
WHERE w_bilder_id = 
     (SELECT w_bilder_id 
     FROM adempiere.w_homepage_image 
     WHERE w_homepage_package_id IN 
      (SELECT sequence, 
      w_homepage_package_id        
      FROM adempiere.w_homepage_package 
      WHERE sequence > 0 
      ORDER BY sequence ASC) 
    LIMIT 1) 
LIMIT 1 
1

Попробуйте этот запрос, при необходимости включите соединение.

SELECT 
    whp.sequence, 
    whp.w_homepage_package_id 
FROM 
    adempiere.w_homepage_package as whp 
    NATURAL JOIN 
     adempiere.w_homepage_image as whi 
    NATURAL JOIN 
     adempiere.w_builder as wbr 
WHERE 
    whp.sequence > 0 
ORDER BY whp.sequence ASC; 
0

это Шоуда будет работать нормально

$res = "SELECT A.*, B.w_bilder_id, C.w_bildurl FROM w_homepage_package A, w_homepage_image B,w_bilder C WHERE A.sequence>O AND B.w_homepage_package_id=A.sequence AND C.w_bildurl=B.w_bilder_id ORDER BY A.sequence ASC"; 
$result = pg_query($dbconn, $res); 
while ($promo = pg_fetch_row($result)) 
{ 

} 
+0

Должен ли я заменить A, B и C на что-то, чтобы сделать эту работу? – user2164882

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