@JustFeeLin
Начинающий веб-мастер

Как объединить 2 запроса к БД, написанных в PHP, в один?

Всем привет и спасибо, что решили попробовать помочь недоучке.

Есть 3 таблицы (имена заданы через константы):
1-ая (TABLE_PRODUCTS_TO_PRODUCTS_EXTRA_FIELDS) содержит свойства и id товаров, для которых они заданы
+---------------+---------------+-----------------------------+----------------------------------+
|_____ID_______|_products_id_|_products_extra_fields_id|_products_extra_fields_value_|
+---------------+---------------+-----------------------------+----------------------------------+
|______1______ |______6 ______|_____________4____________|_____________Y________________|
|______2 ______|______45_____|_____________4____________| _____________ Y ______________ |

2ая (TABLE_PRODUCTS) сокращенно
+---------------+---------------+-----------------------------+----------------------------------+
|_____ID_______|_products_id_|_____products_image_____|____products_page_url_______|
+---------------+---------------+-----------------------------+----------------------------------+
|______1_______|______6_______|_____photo1.jpg__________|__________tovar1.html________|
|______2_______|______25______|_____photo2.jpg__________|__________tovar2.html________|

3ья (TABLE_PRODUCTS_DESCRIPTION) сокращенно
+---------------+---------------+--------------------+
|_____ID_______|_products_id_|_products_name_|
+---------------+---------------+--------------------+
|______1_______|______6_______|____Товар 1______|
|______1_______|______25______|____Товар 2_____|

Выборку делаю следующим образом:
из 1ой таблицы выбираю 5 id товаров, у которых это свойство = 'Y'
Вторым выбираю нужные свойства товаров из 2 товарных таблиц.

Как это выглядит в коде:
$sql = "
    SELECT
        products_id
    FROM " . TABLE_PRODUCTS_TO_PRODUCTS_EXTRA_FIELDS . "
    WHERE
         products_extra_fields_id = '4'
         and products_extra_fields_value = 'Y'
    LIMIT 5";

$productsIds = "";

$query = vamDBquery($sql);

while ($one = vam_db_fetch_array($query,true)) {
    $productsIds .= $one['products_id'].',';    
}

// Теперь выбираем сами товары

$productsIds = substr($productsIds, 0, -1);

$sqlProd = "
    SELECT
        p.products_id,
        p.products_image,
        p.products_page_url,
        p.products_price,
        p.products_tax_class_id,
        d.products_name
    FROM " . TABLE_PRODUCTS . " AS p, " . TABLE_PRODUCTS_DESCRIPTION . " AS d
    WHERE
         p.products_id IN (".$productsIds.")
         and p.products_id=d.products_id";

$queryProd = vamDBquery($sqlProd);

Дальше через fetch это все собирается в один массив и корректно выводится, т.е. это все работает.
НО!
"Плююсь" на способ, которым собираются id-шники да и вообще от 2 запросов для 1 действия. Да вообще, код, мне кажется, даже костылем не назовешь...
Как это оптимизировать можно? Хотелось бы объединить 2 запроса воедино...

Заранее спасибо за помощь
  • Вопрос задан
  • 816 просмотров
Решения вопроса 1
@nozzy
Symfony, Laravel, SQL
select
t1.*,
t2.*,
t3.*
from
TABLE_PRODUCTS_TO_PRODUCTS_EXTRA_FIELDS t1
join TABLE_PRODUCTS t2 on t2.products_id = t1.products_id
join TABLE_PRODUCTS_DESCRIPTION t3 on t3.products_id = t1.products_id
where t1.products_extra_fields_id = '4'
and t1.products_extra_fields_value = 'Y'
limit 5
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы