mysql возвращает результат из таблицы, связанной с другими таблицами

mysql возвращает результат из таблицы, связанной с другими таблицами

05.09.2019 11:08:09 Просмотров 66 Источник

Я пытаюсь показать результат из таблицы, которая связана со многими таблицами, но моя проблема заключается в том, что запрос возвращает только один продукт, который находится на специальном, что я хочу вернуть, это как продукты Продукты на специальном, так и продукты, которые не являются. Мой запрос Php-это :

$query = "SELECT DISTINCT p.product_id, p.price ,sp.date_end, f.percentage AS special_percentage , p.model, pd.name AS title, pd.description AS text, cd.name AS section, p.image, pd.tag, p.date_added AS created "
                ."FROM #__mijoshop_product AS p "
                ."JOIN #__mijoshop_product_special AS sp ON  p.product_id = sp.product_id "
                ."JOIN #__mijoshop_flordeco_product_special_percentage AS f ON sp.product_id = f.product_id "
                ."INNER JOIN #__mijoshop_product_description AS pd ON p.product_id = pd.product_id "
                ."LEFT JOIN #__mijoshop_product_to_store AS ps ON p.product_id = ps.product_id "
                ."LEFT JOIN #__mijoshop_product_to_category AS pc ON p.product_id = pc.product_id "
                ."LEFT JOIN #__mijoshop_category_description AS cd ON (pc.category_id = cd.category_id AND cd.language_id = {$language_id}) "
                ."LEFT JOIN #__mijoshop_category_to_store AS cs ON (pc.category_id = cs.category_id AND cs.store_id = {$store_id}) "
                ."WHERE (LOWER(pd.name) LIKE '%" . $search_text . "%' OR
                        LOWER(pd.description) LIKE '%" . $search_text . "%' OR 
                        LOWER(p.sku) LIKE '%" . $search_text . "%' OR ";

                        if( $model ) {
                            $query .= "LOWER(p.model) LIKE '%" . $search_text . "%' OR ";
                        }

                        $query .= "LOWER(pd.tag) LIKE '%" . $search_text . "%') "
                ."AND p.status = '1' "
                ."AND date(sp.date_end) >= date(NOW()) "
                ."AND p.date_available <= NOW() "
                ."AND ps.store_id = {$store_id} "
                ."AND pd.language_id = '" . $language_id . "' "
                ."GROUP BY p.product_id "
                ."ORDER BY {$order_by} "
                ."LIMIT ".$limit;

        $db->setQuery($query);
        $results = $db->loadObjectList();
У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/57812366/mysql-return-result-from-table-related-to-other-tables#comment102056372_57812366
Пожалуйста, предоставьте окончательный построенный запрос, образец данных, ожидаемый результат и текущий результат.
https://stackoverflow.com/questions/57812366/mysql-return-result-from-table-related-to-other-tables#comment102056484_57812366
Ваш сценарий подвержен риску атак SQL-инъекций . Узнайте о подготовленных заявлениях для MySQLi . Даже Побег из строки не является безопасным!
https://stackoverflow.com/questions/57812366/mysql-return-result-from-table-related-to-other-tables#comment102056877_57812366
Основываясь на используемых функциях, я не уверен, что это SQL Server
https://stackoverflow.com/questions/57812366/mysql-return-result-from-table-related-to-other-tables#comment102056878_57812366
@Barmar это mysql и joomla

Ответы - mysql возвращает результат из таблицы, связанной с другими таблицами / mysql return result from table related to other tables

Является ответом!
Barmar

05.09.2019 11:59:44

Измените соединения с #__mijoshop_product_specialи #__mijoshop_flordeco_product_special_percentageна LEFT JOIN, чтобы оно не ограничивало результаты только продуктами, имеющими совпадения в этой таблице.

Кроме того, вам не нужно использовать SELECT DISTINCTпри использовании GROUP BY p.product_id; поскольку для каждого идентификатора продукта есть только 1 строка, вы не можете получить дубликаты. Однако также не имеет смысла использовать GROUP BY, если вы не используете функции агрегации, такие как SUM()или COUNT(). Если все эти таблицы соответствуют 1 к 1, Вы не должны получать дубликаты, которые должны быть удалены с помощью любой опции.

Закрыть X