ORDER BY子句中具有JOIN的SQL CASE子句

问题描述 投票:1回答:1

我有3张桌子:

  1. 装备
  2. 项目
  3. 颜色

服装搭配表中包含多对多现实的物品项目表与颜色具有多对一关系]

关系看起来像这样

DB Scheme

我需要使用以下逻辑创建搜索功能:如果用户输入“ red airmax”,我会寻找服装如果没有这个名字的服装,我会搜索产品如果还没有这个名字的服装,我会按颜色搜索

所以当我用颜色搜索时,我得到的是红色但不是airmax的项目,我也想通过这种逻辑在项目中搜索airmax,如果DB发现红色产品,也检查产品名称为airmax

我正在使用symfony /主义因此我的带有颜色的sql代码将像这样

SELECT o FROM OutfitsBundle:Outfits o
LEFT JOIN o.item i
LEFT JOIN i.color c
WHERE c.name LIKE '%red%'
OR c.name LIKE '%airmax%'
GROUP BY o.id 
ORDER BY 
CASE 
 WHEN i.name LIKE '%airmax%' THEN 1
 ELSE 0
END

所以这是错误的,因为如果我需要按case子句排序,则需要在GROUP BY子句上添加i.id,但我只需要穿衣服

目标是首先获得名称中带有关键字的产品

目前,我还不知道只搜索airmax而不是红色的项目名称,如果有人知道怎么做也请说一下

数据库示例

表:服装id:1,名称:“ vero moda”;id:2,名称:“ street one”;

表:项目id:1,color_id:3,名称:“ Vero moda运动”;id:2,color_id:1,名称:“ Nike Airmax”;id:3,color_id:2,名称:“ Pepe jeans”;id:4,color_id:2,名称:“ Naketano”;id:5,color_id:3,名称:“ Dockers By Gerli Stiefel”;id:6,color_id:2,名称:“ Jeans”;

表:服装项目id:1,suite_id:1,item_id:1;id:2,suite_id:1,item_id:5;id:3,suite_id:1,item_id:6;id:4,suite_id:2,item_id:2;id:5,suite_id:2,item_id:3;id:6,suite_id:2,item_id:4;

表:颜色id:1,名称:黑色;id:2,名称:蓝色;id:3,名称:粉红色;

php sql symfony doctrine dql
1个回答
0
投票

您提供的详细信息不足,但我会尝试...

SELECT distinct o.name

FROM outfits o
  inner JOIN item i = i.itemid = o.itemid
  inner JOIN color c on c.colorid = i.colorid

WHERE c.name LIKE '%red%'
   OR c.name LIKE '%airmax%'
   or o.name like '%red%'
   OR o.name LIKE '%airmax%'
   or i.name like '%red%'
   OR i.name LIKE '%airmax%'

ORDER BY 
CASE 
   WHEN o.name LIKE '%airmax%' THEN 1
   ELSE 0
END desc
© www.soinside.com 2019 - 2024. All rights reserved.