【问题标题】:SQL CASE clause in ORDER BY clause with JOIN带有 JOIN 的 ORDER BY 子句中的 SQL CASE 子句
【发布时间】:2019-10-04 18:16:47
【问题描述】:

我有 3 张桌子:

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

装备表具有多对多属性的物品
项目表与颜色的关系与manyToOne关系

关系看起来像这样

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

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

我正在使用 symfony/doctrine 所以我的带颜色的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, name: 'vero moda';
id: 2, name: 'street one';

表格:项目
id: 1, color_id: 3, name: 'Vero moda sweetch';
id:2,color_id:1,名称:'Nike Airmax';
id: 3, color_id: 2, name: '佩佩牛仔裤';
id:4,color_id:2,名称:'Naketano';
id: 5, color_id: 3, name: 'Dockers By Gerli Stiefel';
id:6,color_id:2,名称:'牛仔裤';

表格:服饰
id:1,outfit_id:1,item_id:1;
id:2,outfit_id:1,item_id:5;
id:3,outfit_id:1,item_id:6;
id:4,outfit_id:2,item_id:2;
id:5,outfit_id:2,item_id:3;
id:6,outfit_id:2,item_id:4;

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

【问题讨论】:

  • 这还不清楚。您能否展示所有 3 个表的样本数据记录以及预期结果?
  • 那里的加入并不反映“多对多”关系。是不是忘了两张关系表?
  • 您错过了ON 两个JOIN 的条件
  • 哦,对不起,产品颜色是多方关系,我会编辑

标签: php sql symfony doctrine dql


【解决方案1】:

您提供的细节不足,但我会尝试...

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

【讨论】:

  • 我改了几行,之后就成功了,谢谢
猜你喜欢
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 2020-12-12
  • 2021-07-20
  • 2021-01-21
相关资源
最近更新 更多