1

我有这个查询,但它没有显示任何数据,我得到空白结果:

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);

?>

请任何人帮助我...谢谢

4

1 回答 1

1

问题似乎是您要么没有该产品的任何匹配行,oc_product_description要么您在该表中对这些产品的描述具有language_id不同的值1

尽管您使用LEFT JOIN的是连接描述,但您的WHERE条件是使用表的一列oc_product_description,这相当于将其转换为INNER JOIN,因为没有匹配描述的所有产品的结果都将具有NULL值 for 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所以如果条件失败,它只会影响连接。

请注意,如果 products 表有一个带有默认描述的列,您可以使用该列而不是'(no description found)'.

于 2017-11-05T18:39:19.040 回答