У меня есть этот запрос, но он не показывает никаких данных, я получаю пустые результаты:
SELECT * FROM oc_product p
LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id)
WHERE pd.language_id = '1'
GROUP BY p.product_id
ORDER BY pd.name ASC
Я думаю, что проблема в oc_product_description
таблица (описание полей).
Я тоже стараюсь SELECT * FROM oc_product
Это работает нормально, но SELECT * FROM oc_product_description
это не работает, SELECT name FROM oc_product_description
это работает нормально …
Это мой полный код
<?php
// DB
define('DB_DRIVER', 'mysqli');
define('DB_HOSTNAME', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_DATABASE', 'opencart');
define('DB_PORT', '3306');
define('DB_PREFIX', 'oc_');$db = mysqli_connect(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
if (mysqli_connect_errno()) {
echo 'Database connection failed with following errors: ' . mysqli_connect_error();
die();
}$products = [];
//$sql = $db->query("SELECT * FROM ". DB_PREFIX ."product p LEFT JOIN " . DB_PREFIX . "product_description pd ON pd.product_id = p.product_id WHERE pd.language_id = 1");
$sql = $db->query("SELECT * FROM oc_product p LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) WHERE pd.language_id = '1' GROUP BY p.product_id ORDER BY pd.name ASC");
while ($row = mysqli_fetch_assoc($sql)) {
$products[] = $row;
}
echo json_encode($products);
?>
Пожалуйста, помогите мне кто-нибудь … спасибо
Кажется, проблема в том, что у вас нет подходящей строки для этих продуктов в oc_product_description
или что описания, которые вы имеете в этой таблице для этих продуктов, имеют значение в language_id
отличается от 1
,
Хотя вы используете LEFT JOIN
для присоединения к описанию вашего WHERE
условие использования столбца таблицы oc_product_description
, что эквивалентно преобразованию его в INNER JOIN
потому что результаты для всех продуктов без соответствующего описания будут иметь NULL
значение для language_id
, так что условие WHERE pd.language_id = 1
всегда будет ложным
Проверьте содержимое таблицы описания, также вы можете переписать запрос таким образом, чтобы получить результаты также для продуктов без описания:
SELECT p.*, IFNULL(pd.name,'(no description found)') as name
FROM oc_product p
LEFT JOIN oc_product_description pd ON p.product_id = pd.product_id AND pd.language_id = 1
GROUP BY p.product_id
ORDER BY pd.name ASC
Это работает, потому что мы переместили условие в LEFT JOIN
поэтому, если условие не выполняется, оно влияет только на соединение.
Обратите внимание, что если в таблице товаров есть столбец с описанием по умолчанию, вы можете использовать этот столбец вместо '(no description found)'
,
Других решений пока нет …