mysql - 在 where 子句中使用字段而不选择它
问题描述
我试图在 where 子句中使用一个字段而不选择它
类似于 SELECT field 1 FROM table WHERE field2 = 'foo'
$where= $onlyissuing ? " WHERE ISSUE = 1" : "";
$sql="
SELECT c.*
, d.Name_fr as DEVISE
FROM
( SELECT a.Currency_ISO3 as value
, a.Rank as ISSUE
, b.Name_fr as PAYS
FROM countries_currencies a
, countrylist b
where a.Country_ISO3 = b.Country_ISO3
) c
, currencylist d
where c.value = d.Currency_ISO3
";
$sql='
SELECT e.*
, CONCAT(e.value, " - ", e.PAYS, " - ", e.DEVISE ) AS label
FROM ('.$sql.')e
';
$sql = $sql.$where;
因此它可以工作,但如果我不选择 a.Rank 作为问题,我会收到错误致命错误:未捕获的 PDOException:SQLSTATE[42S22]:找不到列:1054 'where 子句'中的未知列'ISSUE'
感谢评论,工作解决方案:
$sql='SELECT a.Currency_ISO3 as value, b.Name_fr as PAYS, c.Name_fr as DEVISE, CONCAT(a.Currency_ISO3, " - ", b.Name_fr, " - ", c.Name_fr ) AS label FROM countries_currencies a INNER JOIN countrylist b on a.Country_ISO3=b.Country_ISO3 INNER JOIN currencylist c on a.Currency_ISO3=c.Currency_ISO3 WHERE a.Rank=1';
解决方案
正如我在评论中所说,您可以从子查询外部访问的唯一字段是它选择的字段。也就是说,我真的不认为这个查询需要有任何子查询。我的 PHP 有点弱,所以仔细检查字符串连接。
sql = "
SELECT cc.Currency_ISO3 AS value
, cc.Rank AS ISSUE
, coL.Name_fr AS PAYS
, cuL.Name_fr AS DEVISE
, CONCAT(cc.Currency_ISO, ' - ', coL.Name_fr, ' - ', cuL.Name_fr) AS label
FROM countries_currencies AS cc
INNER JOIN countrylist AS coL ON cc.Country_ISO3 = coL.Country_ISO3
INNER JOIN currencylist AS cuL ON cc.Currency_ISO3 = cuL.Currency_ISO3
".($onlyissuing ? "WHERE cc.Rank = 1" : "")
;
您会注意到,由于没有子查询,Rank
可以直接在 中引用WHERE
,因此它不需要包含在 中SELECT
(即使是,您也不能SELECT
在 that 中使用别名WHERE
。)
推荐阅读
- visual-studio - 适用于 Office 的 Visual Studio 工具 - 使用多个 Outlook 2013-2016 多次访问同一 gmail 帐户
- javascript - 在 IONIC3 中循环遍历数组时获取和更新记录
- reactjs - 如果注册成功,React redux 登录用户
- rest - 当我尝试使用私有企业 Github 帐户时出现 HTTP 401 错误消息
- sql - 为 SQL 文件生成 TypeScript
- javascript - 一个输入的多个标签上的复选框动画
- react-native - React 本机应用程序突然重新加载包并崩溃。什么可以触发捆绑重新加载?
- php - 正则表达式:在 wordpress 内容中拆分
- android - SoftKeyboard 隐藏 EditText 和 Pull ActionBar
- asp.net-core - ASPNET CORE - 我可以在 IApplicationModelConvention 中添加 ControllerModel 吗?