我有这个查询,但它没有显示任何数据,我得到空白结果:
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);
?>
请帮助我...谢谢
答案 0 :(得分:1)
问题似乎是您在oc_product_description
中没有任何匹配的产品行,或者您在该表中对这些产品的描述的值不同于language_id
1
。
虽然您使用LEFT JOIN
加入说明,但WHERE
条件正在使用表oc_product_description
的列,这相当于将其转换为INNER JOIN
,因为没有匹配描述的所有产品的结果将NULL
的值language_id
,因此条件WHERE pd.language_id = 1
将始终为false。
检查描述表的内容,也可以用这种方式重写查询,以便为没有描述的产品返回结果:
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
,所以如果条件失败,它只会影响连接。
请注意,如果products表中有一个包含默认说明的列,则可以使用该列而不是'(no description found)'
。