2016-04-21 5 views
1

Я хотел бы выполнить два запроса по нескольким таблицам. Первый запрос объединяет несколько таблиц и использует несколько условий. Это примерно так:Выполнить запрос выбора на основе предыдущего запроса

SELECT items.id, tableX.colA, tableY.colB ... 
FROM items 
    LEFT JOIN table2 ON ... 
    LEFT JOIN table3 ON ... 
    ... 
WHERE {some conditions are true} 

Второй запрос - это простой запрос, но он зависит от результата первого. Я хотел бы выбрать все строки, связанные с предыдущим запросом, по их идентификатору. Так что это должно быть что-то вроде этого

SELECT meta_name, meta_value FROM items_meta WHERE item IN ({LIST OF IDS FROM PREVIOUS QUERY}) 

Эти два запроса будут использоваться для различных целей, поэтому они не могут быть объединены в одну.

Я думал о сохранении результата первого запроса во временной таблице, а затем ПРИСОЕДИНИТЬ второй запрос к нему. Но я не могу найти достойный способ вернуть строки первого запроса и поместить идентификаторы во временную таблицу.

Все материалы с большой благодарностью. Спасибо

+0

Ваш ID должен быть соединен запятой (,) –

+0

Просто используйте JOIN – Strawberry

ответ

0

Вы должны спроектировать свой ID's, как я использую в запросе. Здесь вы можете использовать функцию join.

Запрос

SELECT meta_name, meta_value FROM items_meta WHERE item IN ('4', '8', '11') 
+0

Да, но это на самом деле не помогает ему сделать это сейчас. Это скорее комментарий, чем ответ! – RiggsFolly

+0

Как он упоминает «Первый запрос объединяет несколько таблиц». Поэтому я предлагаю присоединиться к идентификаторам. –

+0

Спасибо за ваш вклад. Это текущая реализация. Функция join() не будет работать, потому что результат состоит из нескольких столбцов.Поэтому я использую функцию foreach() PHP для формирования списка идентификаторов. Я думал, что может быть более подходящий способ сделать это в SQL без PHP – elSama

2

Вот два варианта:

  • магазин результаты первого запроса в (временной) таблице. Затем используйте эту таблицу в последнем запросе.
  • Сохраните результаты первого запроса в приложении, а затем создайте список IN.

Или просто объединить запросы с помощью:

SELECT meta_name, meta_value 
FROM items_meta 
WHERE item IN (SELECT items.id 
       FROM table1 
        LEFT JOIN table2 ON ... 
        LEFT JOIN table3 ON ... 
        ... 
       WHERE {some conditions are true} 
      ); 
+0

Сэр, это 'tableX.colA, tableY.colB ...' не проблема для этой цели ?? –

+0

... или просто построить правильный запрос – Strawberry

+1

Итак, это * три * опции then;) – MatBailie

1

Я предлагаю не делать второй запрос через SQL, но делает это через PHP. После выполнения вашего первого запроса, затем сохранить выбранную информацию в массив:

//MySQL (PDO): 
$sql = "...";//your first SQL code 
$sqlPrepared = $conn->prepare($sql); 
$sqlPrepared->execute(); 

$rows = $sqlPrepared->fetchAll(PDO::FETCH_ASSOC); 

На данный момент вы бы массив с информацией, которую вы должны сделать свой второй алгоритм/запрос/фильтр/независимо Хах , Если бы вы разместили его в другой таблице, вам нужно было бы создать новую таблицу со всеми новыми столбцами, которая немного утомительна. Вместо этого вы можете:

$new_rows = array(); 
foreach ($rows as $row) 
{ 
    /*here you check if the row has the values you seek in the 'item' column 
    WHERE item IN ({LIST OF IDS FROM PREVIOUS QUERY})*/ 
    if (($row['item']== '4')||($row['item']== '10')||...) 
    { 
    array_push($new_rows, $row); 
    } 
} 

Теперь у вас есть $ new_rows массив, который вы можете использовать, чтобы проверить выбранную информацию с чем-то вроде:

print_r($new_rows); 

Позвольте мне знать, если это то, что вы искали!

+0

Я думаю, что этот подход аналогичен предложенному @FrayneKanok. И вот что я буду использовать – elSama

+0

@elSama Glad Я мог бы помочь. Если у вас есть сомнения в том, как его реализовать, не стесняйтесь размещать вопрос здесь в комментариях :) – Webeng

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