如果另一个值不存在,如何根据一个值从表中选择项目? (雄辩/sql)

2023-12-08

我有一个表,用于存储网站的不同文本块。我目前正在为每个页面选择正确的块以及页面的标题和首选语言。当首选语言不可用时,我想在后备语言中选择相同的文本块(具有相同的标题)。

块表

columns:
| id | slug | title | language | content |

entries:
| 1 | home | first | en | the first block |
| 2 | home | first | nl | het eerste blok |
| 3 | home | second | en | the second block |
    --> block "second" not available for the 'nl' language

所需输出

fallback language = en

selected prefered language = en, output:
| 1 | home | first | en | the first block |
| 3 | home | second | en | the second block |

selected prefered language = nl, output:
| 2 | home | first | nl | het eerste blok |
| 3 | home | second | en | the second block |
     --> select this one, because the 'nl' version is not available

目前,我只选择具有所选首选语言的块,因为如果“首选语言”块不可用,我不知道如何通过选择“后备语言”块来解决此问题。我可以尝试对两种语言运行两个查询,然后以某种方式合并它们,并且仅在该块的标题计数低于 1 时插入“后备语言”块,但这看起来相当复杂且不太优雅?

对于我的应用程序,我使用雄辩:

$blocks = Block::->where('slug', '=', 'home')
                ->whereIn('language', $selectedLanguage)
                ->get();

我怎么能用雄辩的方式做到这一点? (或者在原始 SQL 中,就此而言?)


如果我理解正确的话,如果已经有一行具有相同的首选语言,那么您想要“删除”具有后备语言的行slug and title.

您可以使用 LEFT JOIN 作为后备语言来检查是否存在具有首选语言的条目。例如,如果您的首选语言是“nl”并且后备语言是“en”,您的查询可能如下所示:

select blocks.*
from blocks
left join blocks b1
    on  b1.slug  = blocks.slug
    and b1.title = blocks.title
    and b1.language = 'nl'
    and blocks.language <> 'nl'
where blocks.slug = 'home'
  and blocks.language in ('nl', 'en')
  and b1.id is null

sqlfiddle

单词的连接可能是这样的:寻找相同的更好的翻译slug and title。如果该语言是首选语言,则不会匹配,因为blocks.language <> 'nl'。否则,连接将“搜索”首选翻译('b1.language = 'nl').

在 WHERE 子句中,我们只告诉在没有找到更好的翻译的情况下返回行(b1.id is null).

我能做的将查询转换为雄辩的最好方法是:

$prefered = 'nl';
$fallback = 'en';

$blocks = App\Block::where('blocks.slug', '=', 'home')
    ->whereIn('blocks.language', [$prefered, $fallback])
    ->leftJoin('blocks as b1', function($join) {
        $join->on('b1.slug', '=', 'blocks.slug')
             ->on('b1.title', '=', 'blocks.title')
             ->on('b1.language', '=', DB::raw('?'))
             ->on('blocks.language', '<>', DB::raw('?'))
        ;
    })
    ->whereNull('b1.id')
    ->addBinding([$prefered, $prefered], 'join')
    ->select(DB::raw('blocks.*'))
    ->get()
;

注意:我假设title对于所有语言中的块来说都是相同的。否则你将需要另一列(例如block_id)来识别一个块。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果另一个值不存在,如何根据一个值从表中选择项目? (雄辩/sql) 的相关文章

  • #1045 - 用户“root”@“localhost”的访问被拒绝(使用密码:YES)

    这可能看起来多余 但我无法找到正确的解决方案 我无法使用 mysql 控制台登录 mysql 它要求输入密码 但我不知道我实际输入的内容 有办法获取密码或更改密码吗 这就是我的 config inc 的样子 当我尝试打开 phpmyadmi
  • 从数据库 MYSQL 和 Codeigniter 获取信息

    如果你们需要其他信息 上一个问题就在这里 从数据库中获取信息 https stackoverflow com questions 13336744 fetching information from the database 另一个更新 尽
  • 将多行合并为一行并根据行数附加列

    我正在尝试将同一个表的多行合并为一个 我有一个像这样的示例表 Col1 Col2 Col3 Col4 Col5 Col6 1 BH1 CB 12 CC CC Conveyor Mal 1 BH1 CB 104 ZC ZC Full Emp
  • Oracle:如果表存在

    我正在为 Oracle 数据库编写一些迁移脚本 并希望 Oracle 有类似于 MySQL 的东西IF EXISTS构造 具体来说 每当我想删除 MySQL 中的表时 我都会执行类似的操作 DROP TABLE IF EXISTS tabl
  • 让 Prometheus 发送 SQL 查询

    我正在尝试使用普罗米修斯 https prometheus io 监视我的 MySQL 数据库 但似乎找不到添加 SQL 查询的区域 例如 我想运行一个返回值的 SQL 查询 然后将该值添加到图表中 发送警报 有没有办法让 Promethe
  • 对具有许多索引的表进行缓慢的批量插入

    我尝试将数百万条记录插入到具有 20 多个索引的表中 在上次运行中 每 100 000 行花费了 4 个多小时 并且查询在 3 5 天后被取消 您对如何加快速度有什么建议吗 我怀疑是索引太多的原因 如果你也这么认为 如何在操作前自动删除索引
  • INNER JOIN 可用作 SELECT,但不能用作 DELETE [重复]

    这个问题在这里已经有答案了 为什么这个有语法错误 DELETE FROM print mailing request pmr INNER JOIN person p ON p id pmr person AND p email LIKE T
  • SQL Server 中的派生表

    我有这两个疑问 我不知道如何将它们组合在一起来制作派生表 我假设使用第二个查询作为主查询 并在主查询的 FROM 子句中使用第一个查询 SELECT EmailAddress Orders OrderID SUM ItemPrice Qua
  • ORA-01749: 您不能向自己授予/撤销权限

    我正在运行以下查询RATOR MONITORING授予引用权限的架构RATOR MONITORING CONFIGURATION SMSC GATEWAY表到RATOR MONITORING schema GRANT REFERENCES
  • 更新每组单行

    的背景 我有一个临时表 其中包含唯一的 rowID OrderNumber 和 guestCount 等信息 RowID 和 OrderNumber 已存在于该表中 并且我正在运行一个新查询来填充每个 orderNumber 缺少的 gue
  • 使用 xmlagg 时出现子查询错误和太多值

    我在连接许多大型表中的所有数据时遇到问题 我昨天对此提出了问题 但不幸的是 listagg 似乎不是一个好的选择 链接子查询返回多行 https stackoverflow com questions 54651144 subquery r
  • SQL 插入失败 - 违反主键约束

    我在 SQL Insert 语句中看到一个非常奇怪的问题 我有一个简单的表 带有一个 ID 和 2 个日期时间 请参阅下面的创建脚本 CREATE TABLE dbo DATA POPULATION LOGS ID int IDENTITY
  • ORDER BY 之后的 GROUP BY

    我需要去做GROUP BY after ORDER BY 我不明白为什么 MySQL 不支持这一点 这是我的代码 SELECT pages id contents id language ORDER BY FIND IN SET langu
  • SQL Server递归查询显示父级路径

    我正在使用 SQL Server 语句并有一张表 例如 item value parentItem 1 2test 2 2 3test 3 3 4test 4 5 1test 1 6 3test 3 7 2test 2 我想使用 SQL S
  • MYSql 前 10 名及其他总计

    我的查询运行良好 但我只需要前 10 个供应商 然后我需要将所有剩余的总计放在 所有其他 行中 如果没有单独的查询 我该如何做到这一点LIMIT 10 18446744073709551615 SELECT VENDOR fullname
  • MySql 从另一个表中减去一个表

    我有两个表 A 包含所有数据 表 B 从 A 中随机选择 25 的数据创建 所以 A 和 B 具有完全相同的列 也没有独特的列 我想做的是从 A 中减去 B 有什么想法吗 查看所有行A除了那些在B SELECT FROM A WHERE f
  • MySQL 中非空值的计数和分组

    我需要计算按特定 ID 分组的非空 我的意思是至少包含 1 个字符的字符串 行 例如 我的数据可能如下所示 form id mapping 1 value 1 1 1 value 2 2 2 NULL 3 value 3 我想计算每个表单的
  • MySQL 选择第一个字符在哪里

    如何选择单元格的第一个字符并使用它来定义返回的内容 看看MySQL 字符串 和 控制流 功能 http dev mysql com doc refman 5 1 en functions html 例如 SELECT IF LEFT myF
  • MySQL 中的 group_concat 性能问题

    我添加了一个group concat到一个查询并杀死了性能 添加之前和之后的解释计划是相同的 所以我对如何优化它感到困惑 这是查询的简化版本 SELECT curRow curRow 1 AS row number docID docTyp
  • 如何在SqlAlchemy中执行“左外连接”

    我需要执行这个查询 select field11 field12 from Table 1 t1 left outer join Table 2 t2 ON t2 tbl1 id t1 tbl1 id where t2 tbl2 id is

随机推荐

  • 为什么 requestAnimationFrame() 在帧末尾运行我的代码,而不是在帧开头?

    var y 0 canvas height 5 ctx fillStyle green function update requestAnimationFrame update ctx clearRect 0 0 canvas width
  • 100% 的子 div 高度被忽略

    我正在使用 Peter 的优秀示例 即 100 高度的 div 和粘性页脚 HERE 我省略了页脚部分 因为我没有使用它 但是 每当我使用子 div 并尝试做同样的事情时 它都不起作用 我希望子 div 也采用其父级高度的 100 这是CS
  • 如何在 Android 上启用 cmake 的剥离

    我们正在开发一个带有原生部分的 Android 库 我们主要是 Java 开发人员 而不是 C 开发人员 我们的一点点 C 经验足以编写我们需要的本机代码 但我们在剥离方面遇到了意想不到的麻烦 这与编程没有直接关系 由于某些原因 我们确实需
  • 合并合并 pdf 之间的字体 itextsharp C#

    我需要将多个 pdf 合并在一起 我正在使用 itextsharp 创建所有 pdf 我需要将 pdf 的大小减小到尽可能小的大小 我知道每个 pdf 的字体都是重复的 合并后的 pdf 中是否只能使用一组字体 例如 pdf1是2 8mb
  • Python在数据框中每周增加日期

    我正在尝试满足此要求 我需要以周为单位增加日期 以下是相同的代码 import pandas as pd import numpy as np c 15 s week 1 2 3 4 5 6 7 8 Sales 10 20 30 40 50
  • Java 泛型方法重写

    我有界面 public interface CartService extends RemoteService
  • 如何使用 npm 发布客户端脚本?

    我的 Nodejs 包包含在后端执行的代码以及在浏览器上执行的单个 js 文件 要使用浏览器脚本 必须将其放入script显然 HTML 文件中的元素 我的问题是 是否存在关于浏览器 js 文件如何以独立于 webpack gulp gru
  • pandas from_json 方法用法

    我有一个如下所示的 JSON 文件 A 1 B 2 C x 1 y 2 z 3 x 2 y 7 z 77 pandas from json返回包含 A B 和 C 列的数据框 但是 实际上我正在寻找包含 x y 和 z 的列 有办法得到吗
  • 使用Python子进程将stdout重定向到stdin?

    我正在使用 subprocess 模块从 shell 调用程序 该模块将二进制文件输出到 STDOUT 我使用 Popen 调用程序 然后我想将流传递给 Python 包 称为 pysam 中的函数 不幸的是 该函数不能使用 Python
  • 使用 DX:AX 装配 x86 划分

    我正在使用 masm 遇到了一个我不太明白如何解决的场景 例如 X A C D 如果我先乘以 C D 我的值是 DX AX 据我所知 我不能将其用作除数 如果我将 A C 和 A D 分开进行除法 我就会面临失去精度的风险 来自提醒等 实现
  • 从名称实例化泛型的最佳方法是什么?

    假设我只有 MyCustomGenericCollection of MyCustomObjectClass 形式的字符串形式的泛型类名 并且不知道它来自哪个程序集 那么创建该对象的实例的最简单方法是什么 如果有帮助 我知道该类实现 IMy
  • Tomcat连接池,为Web应用程序安装jdbc驱动程序

    我正在制作一个网络应用程序Tomcat 6作为容器 我正在尝试使用连接池 我正在使用的jdbc驱动程序是jtds 1 2 2 当驱动程序 jar 放在下面时 池工作正常 Catalina Home lib 但我的托管提供商不允许我这样做 当
  • 最佳实践:在 PHP 中使用长的多行字符串?

    注意 如果这是一个非常简单的问题 我很抱歉 但我对代码的格式有点强迫症 我有一个类 它有一个函数返回一个字符串 该字符串将构成电子邮件的正文 我希望该文本经过格式化 以便在电子邮件中看起来正确 但也不会让我的代码看起来很时髦 这就是我的意思
  • 核心数据对象唯一ID

    我想向我的托管对象实体模型添加一个唯一的 ID 字段 我知道核心数据不使用 ID 关系 但这是不同的 我需要一种将线程安全数据传递给不同线程的方法 以便新线程可以从该数据中获取托管对象 它可以是任何格式 但最好只是单个对象 变量 值 我可以
  • SQL 错误:ORA-00907:缺少右括号

    我正在使用 Oracle SQL Developer 使用以下命令创建一个基本表 CREATE TABLE chartered flight flight no NUMBER 4 PRIMARY KEY customer id FOREIG
  • 创建仅包含给定类的对象的数组

    好的 我有下面的代码 Objective C FYI 我想知道是否要创建一个 NSMutableArrayc data对象 我该怎么做呢 这有点像声明一个List
  • 如何将用户输入保存在数组中?

    我正在尝试编写一个程序 要求用户输入要保存在医院数据库中的患者数量 即ArraySize 用户必须输入患者的 ID 名字和姓氏 然后根据患者病情的严重程度在数组中对患者的 ID 名字和姓氏进行索引 我的问题是如何将用户输入的 ID 保存为整
  • 测试非默认 App Engine 任务队列

    App Engine 文档给出了example单元测试任务队列 这对于 默认 队列工作正常 但我需要对非默认队列进行单元测试 我从以下行中得到异常 val qsi ltq getQueueStateInfo get non default
  • 当我保存文件时 Sublime Text 正在做什么?

    我正在观看文件fsnotify这是一个Go库 我发现保存文件时会触发很多事件 为什么 Sublime Text 有这么多功能 2013 12 17 20 46 25 event parser go MODIFY 2013 12 17 20
  • 如果另一个值不存在,如何根据一个值从表中选择项目? (雄辩/sql)

    我有一个表 用于存储网站的不同文本块 我目前正在为每个页面选择正确的块以及页面的标题和首选语言 当首选语言不可用时 我想在后备语言中选择相同的文本块 具有相同的标题 块表 columns id slug title language con