我需要您对这个自定义查询的帮助,这对我来说有点太难了。这是 my_table 的示例:
_______________________________
| item_name | item_slug |
-------------------------------
| Black Pant | pant_black | Select : pick first color, 'pant' doesn't exists
| Red Pant | pant_red | Variation: 'pant_black'
| Yellow Pant | pant_yellow | Variation: 'pant_black'
| Tshirt | tshirt | Select : 'tshirt' exists
| Tshirt Black | tshirt_black | Variation: 'tshirt'
| Tshirt Red | tshirt_red | Variation: 'tshirt'
| Tshirt Yellow| tshirt_yellow| Variation: 'tshirt'
-------------------------------
我尝试得到的结果是:
如果('tshirt' && 'tshirt_black' 存在):
不要显示“tshirt_black”、“tshirt_red”、“tshirt_yellow”颜色并将它们放入“variations”数组中:
tshirt
| Variations:
|-> tshirt_black
|-> tshirt_red
|-> tshirt_yellow
如果(“pant”不存在&&“pant_black”存在):
采用找到的第一个颜色“pant_black”,不显示“pant_red”、“pant_yellow”颜色并将它们放入“variations”数组中:
pant_black
| Variations:
|-> pant_red
|-> pant_yellow
注意:“裤子”不存在,仅存在颜色。
当无色名称存在('tshirt')时,我设法通过以下查询使其工作:
SELECT * FROM my_table WHERE item_name NOT LIKE '% Black' AND item_name NOT LIKE '% Red' AND item_name NOT LIKE '% Yellow'
然后,我在 PHP foreach() 中应用第二个查询,将“Tshirt”变体放入数组中。
SELECT * FROM my_table WHERE item_slug LIKE '$item_slug%' AND item_slug != '$item_slug'
但我找不到一种方法来递归检查 if('pant' didesn't Exes),然后使用找到的第一个颜色作为“基础”。例如“pant_black”。
完美的解决方案是使其成为一体化查询。你觉得怎么样?
编辑:编辑我的帖子以仅使用“item_slug”。
最佳答案
如果您想获取两列,一列包含基本名称,另一列包含变体(如果是基本名称则为 NULL),那么您可以添加一个标志来查找基本名称。
也许这接近你想要的:
select ColorlessName,
(case when item_name <> ColorlessName then item_name end) as variation
from (select t.*,
(select t2.item_name
from my_table t2
where substring_index(t2.item_slug, '_', 1) = substring_index(t.item_slug, '_', 1)
order by length(t2.item_name) desc, t2.item_name
limit 1
) as ColorlessName
from my_table t
) t
order by ColorlessName, (variation is null) desc;
关于php - MySQL 查询 SELECT 与 IF(xxxx 已存在) 递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29795771/