Warm tip: This article is reproduced from serverfault.com, please click

php-SQL查询结果的条件级联

(php - Conditional Concatenation of SQL Query results)

发布于 2020-11-30 08:14:00

我想显示一个查询结果,并根据一个值将它们的自身连接起来。

我有这个查询

        SELECT CONCAT(cl.`name`,\',\') as name
        FROM `'._DB_PREFIX_.'category_lang` AS cl
        INNER JOIN `'._DB_PREFIX_.'category` AS c ON (cl.`id_category` = c.`id_category`)
        WHERE cl.`name` LIKE \'%'.pSQL($searchData).'%\'
        AND c.`level_depth` NOT IN (0, 1, 4, 5) and cl.`id_lang`='.(int)$context->language->id.'

会根据用户输入的内容显示预订平台的可用位置列表。

在此处输入图片说明

这是结果列表:

Lisbon
Ortisei
Palermo
Polignano a Mare
Portugal

内部联接表的结果如下

以上查询结果

如你所见,表的每个条目都有不同的level_depth。

我想用其id_parent的名称对所有level_depth = 3的条目进行CONCAT,并显示所有level_depth = 2的条目而无任何串联。

以上结果应变为:

Lisbon, Portugal
Ortisei, Italy
Palermo, Italy
Polignano a Mare, Italy
Portugal
Questioner
Marco Martines
Viewed
11
user14717238 2020-11-30 17:46:23

这需要id_parent进行level_depth 2的左联接。你应该以如下形式结束:

SELECT 
    CONCAT_WS(\', \', cl.`name`, cl_parent.`name`) as name
FROM `'._DB_PREFIX_.'category_lang` AS cl
INNER JOIN `'._DB_PREFIX_.'category` AS c 
    ON (cl.`id_category` = c.`id_category`)
LEFT JOIN `'._DB_PREFIX_.'category` AS c_parent 
    ON (c_parent.`id_category` = c.`id_parent`) 
    AND c_parent.`level_depth` = 2
LEFT JOIN `'._DB_PREFIX_.'category_lang` AS cl_parent 
    ON (cl_parent.`id_category` = c_parent.`id_category`) 
    AND cl_parent.id_lang = cl.id_lang
WHERE 
    CONCAT_WS(\', \', cl.`name`, cl_parent.`name`) LIKE \'%'.pSQL($searchData).'%\'
    AND c.`level_depth` IN (2, 3) and cl.`id_lang`='.(int)$context->language->id.'