mysql return 来自 table 与其他 table 相关的结果
mysql return result from table related to other tables
我正在尝试显示 table 的结果,该结果与许多 table 相关,但我的问题是查询 return 只有一种产品符合我的特殊要求想要 return 既有特价商品也有非特价商品。
我的 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();
将 #__mijoshop_product_special
和 #__mijoshop_flordeco_product_special_percentage
的联接更改为 LEFT JOIN
,这样它就不会将结果仅限于在 table 中具有匹配项的产品。
另外,使用GROUP BY p.product_id
的时候不需要使用SELECT DISTINCT
;由于每个产品 ID 只有 1 行,因此您无法获得任何重复项。但是,当您不使用任何聚合函数(如 SUM()
或 COUNT()
时,使用 GROUP BY
也没有意义。如果所有这些 table 都是一对一的对应关系,那么您应该不会得到任何需要使用任一选项删除的重复项。
我正在尝试显示 table 的结果,该结果与许多 table 相关,但我的问题是查询 return 只有一种产品符合我的特殊要求想要 return 既有特价商品也有非特价商品。 我的 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();
将 #__mijoshop_product_special
和 #__mijoshop_flordeco_product_special_percentage
的联接更改为 LEFT JOIN
,这样它就不会将结果仅限于在 table 中具有匹配项的产品。
另外,使用GROUP BY p.product_id
的时候不需要使用SELECT DISTINCT
;由于每个产品 ID 只有 1 行,因此您无法获得任何重复项。但是,当您不使用任何聚合函数(如 SUM()
或 COUNT()
时,使用 GROUP BY
也没有意义。如果所有这些 table 都是一对一的对应关系,那么您应该不会得到任何需要使用任一选项删除的重复项。