如何在单条SQL查询中判断WHERE子句中哪个匹配条件生效
单SQL实现优先级条件查询并返回匹配类型的方案
你可以通过在查询中新增匹配标识字段 + 优先级排序的方式实现需求,仅需一次数据库查询即可同时拿到目标数据和匹配的语言类型,无需多次执行查询。
具体实现逻辑
- 用
CASE表达式新增matched_lang字段,直接返回当前行匹配的语言标识 - 排序规则设置为第一个匹配条件(url_ar匹配)的行优先级更高,即使存在同时满足两个条件的异常数据,也会优先返回第一个条件匹配的结果
- 用
LIMIT 1取优先级最高的1条结果即可
代码示例
兼容所有MySQL版本的写法
$targetUrl = $_GET["url"]; $sql = $DB_->prepare(" SELECT *, CASE WHEN url_ar = ? THEN 'ar' WHEN url_fr = ? THEN 'fr' END AS matched_lang FROM tbl_items WHERE url_ar = ? OR url_fr = ? ORDER BY CASE WHEN url_ar = ? THEN 1 ELSE 2 END LIMIT 1 "); // 绑定5次相同的目标url参数 $sql->bind_param("sssss", $targetUrl, $targetUrl, $targetUrl, $targetUrl, $targetUrl); $sql->execute(); $result = $sql->get_result(); if ($result->num_rows > 0) { $row = $result->fetch_assoc(); $lang = $row['matched_lang']; // 后续业务逻辑 } else { echo "unfound"; exit; }
MySQL 8.0+ 简化写法(仅需绑定1次参数)
如果你用的数据库支持CTE(公共表表达式),可以避免重复绑定参数:
$targetUrl = $_GET["url"]; $sql = $DB_->prepare(" WITH input_param AS (SELECT ? AS target_url) SELECT *, CASE WHEN url_ar = target_url THEN 'ar' WHEN url_fr = target_url THEN 'fr' END AS matched_lang FROM tbl_items, input_param WHERE url_ar = target_url OR url_fr = target_url ORDER BY IF(url_ar = target_url, 1, 2) LIMIT 1 "); $sql->bind_param("s", $targetUrl); $sql->execute(); $result = $sql->get_result(); // 后续处理逻辑和上面一致
内容的提问来源于stack exchange,提问作者Fitri Ahmed
相关产品推荐
相关产品推荐

