在 'AS' 列中使用 LIKE 搜索
Search with LIKE in a 'AS' column
我有以下 MySQL 查询:
SELECT DISTINCT spelers.spelerscode,
spelers.voornaam,
spelers.achternaam,
CASE spelers.positie
WHEN 1 THEN 'Keeper'
WHEN 2 THEN 'Verdediger'
WHEN 3 THEN 'Middenvelder'
WHEN 4 THEN 'Aanvaller'
WHEN 5 THEN 'Coach'
END AS positie,
elftallen.elftal_naam,
(SELECT COUNT(spelerscode) FROM teams WHERE spelers.spelerscode = teams.spelerscode) AS gekozen
FROM spelers
LEFT JOIN elftallen
USING (elftallen_id)
LEFT JOIN teams
USING (spelerscode)
WHERE spelerscode LIKE '%$zoekwoord%'
OR elftal_naam LIKE '%$zoekwoord%'
OR positie LIKE '%$zoekwoord%'
OR voornaam LIKE '%$zoekwoord%'
OR achternaam LIKE '%$zoekwoord%'
ORDER BY spelerscode
例如,当我在 'Keeper' 上搜索时,我想显示所有的守门员。
有了这个查询,它没有给我任何结果..
有办法实现吗?
所以您希望查询在搜索 Keeper 时显示正值为 1 的记录?您不能在 WHERE 子句中使用 SELECT 子句的别名。因此,您必须在 WHERE 子句中使用与在 SELECT 子句中使用的相同的 CASE 子句。
WHERE spelerscode LIKE '%$zoekwoord%'
OR elftal_naam LIKE '%$zoekwoord%'
OR CASE spelers.positie
WHEN 1 THEN 'Keeper'
WHEN 2 THEN 'Verdediger'
WHEN 3 THEN 'Middenvelder'
WHEN 4 THEN 'Aanvaller'
WHEN 5 THEN 'Coach'
END LIKE '%$zoekwoord%'
OR voornaam LIKE '%$zoekwoord%'
OR achternaam LIKE '%$zoekwoord%'
ORDER BY spelerscode;
顺便说一句:最好用 table 作为位置,而不是偷偷知道 1 表示守门员,2 表示后卫,并且必须在所有其他查询中记住这一点并且永远不要混淆他们。
几个解决方案:
1:将 CASE
放在 SUBSELECT
中:
SELECT * FROM
(SELECT DISTINCT spelers.spelerscode,
spelers.voornaam,
spelers.achternaam,
CASE spelers.positie
WHEN 1 THEN 'Keeper'
WHEN 2 THEN 'Verdediger'
WHEN 3 THEN 'Middenvelder'
WHEN 4 THEN 'Aanvaller'
WHEN 5 THEN 'Coach'
END AS positie,
elftallen.elftal_naam,
(SELECT COUNT(spelerscode) FROM teams WHERE spelers.spelerscode = teams.spelerscode) AS gekozen
FROM ...
) as subselectTable
WHERE spelerscode LIKE '%$zoekwoord%'
OR elftal_naam LIKE '%$zoekwoord%'
OR positie LIKE '%$zoekwoord%'
OR voornaam LIKE '%$zoekwoord%'
OR achternaam LIKE '%$zoekwoord%'
ORDER BY spelerscode
2:创建一个 "translation table"...
Code Description
----------------
1 Keeper
2 Verdediger
...
并加入...
SELECT DISTINCT spelers.spelerscode,
spelers.voornaam,
spelers.achternaam,
translationTable.Description AS positie,
elftallen.elftal_naam,
(SELECT COUNT(spelerscode) FROM teams WHERE spelers.spelerscode = teams.spelerscode) AS gekozen
FROM spelers
LEFT JOIN elftallen
USING (elftallen_id)
LEFT JOIN teams
USING (spelerscode)
JOIN translationTable
ON spelers.positie = translationTable.Code
WHERE spelerscode LIKE '%$zoekwoord%'
OR elftal_naam LIKE '%$zoekwoord%'
OR translationTable.Description LIKE '%$zoekwoord%'
OR voornaam LIKE '%$zoekwoord%'
OR achternaam LIKE '%$zoekwoord%'
ORDER BY spelerscode
- 像 Thorsten Kettner 建议的那样在 WHERE 中进行翻译
这对于评论来说太长了,这确实应该是 Jonny 的回答。但是,答案值得一些解释。
您将新变量定义为 as positie
,您 重命名了 一个已被 from
子句识别的列。您期望 SQL 语句中的其他引用引用新定义。但是,select
中定义的列别名在 select
、from
或 where
子句中的其他任何地方都不可用。 (在 MySQL 中,它们在 group by
、having
和 order by
中可用,但标准仅指定 order by
需要识别它们。)
所以,当你说:
WHERE positie LIKE '%$zoekwoord%'
你真的是在说:
WHERE spelers.positie LIKE '%$zoekwoord%'
你会清楚地认识到这是永远不匹配的。
有很多不同的解决方案:
- A Jonny 建议,只需使用
spelers.positie = 1
。
- 在
where
子句中重复 case
逻辑(尽管我认为这很丑陋,所以这是我最不喜欢的解决方案)。
- 使用引用 table 和
join
而不是 case
逻辑将职位编号转换为职位名称。
- 使用枚举类型并且在整个代码中只引用名称。
- 使用
having
子句:having positie LIKE '%$zoekwoord%'
。 having
子句 可以 引用别名,尽管我仍然会更改别名的名称,以便数字和名称具有不同的值。
我有以下 MySQL 查询:
SELECT DISTINCT spelers.spelerscode,
spelers.voornaam,
spelers.achternaam,
CASE spelers.positie
WHEN 1 THEN 'Keeper'
WHEN 2 THEN 'Verdediger'
WHEN 3 THEN 'Middenvelder'
WHEN 4 THEN 'Aanvaller'
WHEN 5 THEN 'Coach'
END AS positie,
elftallen.elftal_naam,
(SELECT COUNT(spelerscode) FROM teams WHERE spelers.spelerscode = teams.spelerscode) AS gekozen
FROM spelers
LEFT JOIN elftallen
USING (elftallen_id)
LEFT JOIN teams
USING (spelerscode)
WHERE spelerscode LIKE '%$zoekwoord%'
OR elftal_naam LIKE '%$zoekwoord%'
OR positie LIKE '%$zoekwoord%'
OR voornaam LIKE '%$zoekwoord%'
OR achternaam LIKE '%$zoekwoord%'
ORDER BY spelerscode
例如,当我在 'Keeper' 上搜索时,我想显示所有的守门员。 有了这个查询,它没有给我任何结果.. 有办法实现吗?
所以您希望查询在搜索 Keeper 时显示正值为 1 的记录?您不能在 WHERE 子句中使用 SELECT 子句的别名。因此,您必须在 WHERE 子句中使用与在 SELECT 子句中使用的相同的 CASE 子句。
WHERE spelerscode LIKE '%$zoekwoord%'
OR elftal_naam LIKE '%$zoekwoord%'
OR CASE spelers.positie
WHEN 1 THEN 'Keeper'
WHEN 2 THEN 'Verdediger'
WHEN 3 THEN 'Middenvelder'
WHEN 4 THEN 'Aanvaller'
WHEN 5 THEN 'Coach'
END LIKE '%$zoekwoord%'
OR voornaam LIKE '%$zoekwoord%'
OR achternaam LIKE '%$zoekwoord%'
ORDER BY spelerscode;
顺便说一句:最好用 table 作为位置,而不是偷偷知道 1 表示守门员,2 表示后卫,并且必须在所有其他查询中记住这一点并且永远不要混淆他们。
几个解决方案:
1:将 CASE
放在 SUBSELECT
中:
SELECT * FROM
(SELECT DISTINCT spelers.spelerscode,
spelers.voornaam,
spelers.achternaam,
CASE spelers.positie
WHEN 1 THEN 'Keeper'
WHEN 2 THEN 'Verdediger'
WHEN 3 THEN 'Middenvelder'
WHEN 4 THEN 'Aanvaller'
WHEN 5 THEN 'Coach'
END AS positie,
elftallen.elftal_naam,
(SELECT COUNT(spelerscode) FROM teams WHERE spelers.spelerscode = teams.spelerscode) AS gekozen
FROM ...
) as subselectTable
WHERE spelerscode LIKE '%$zoekwoord%'
OR elftal_naam LIKE '%$zoekwoord%'
OR positie LIKE '%$zoekwoord%'
OR voornaam LIKE '%$zoekwoord%'
OR achternaam LIKE '%$zoekwoord%'
ORDER BY spelerscode
2:创建一个 "translation table"...
Code Description
----------------
1 Keeper
2 Verdediger
...
并加入...
SELECT DISTINCT spelers.spelerscode,
spelers.voornaam,
spelers.achternaam,
translationTable.Description AS positie,
elftallen.elftal_naam,
(SELECT COUNT(spelerscode) FROM teams WHERE spelers.spelerscode = teams.spelerscode) AS gekozen
FROM spelers
LEFT JOIN elftallen
USING (elftallen_id)
LEFT JOIN teams
USING (spelerscode)
JOIN translationTable
ON spelers.positie = translationTable.Code
WHERE spelerscode LIKE '%$zoekwoord%'
OR elftal_naam LIKE '%$zoekwoord%'
OR translationTable.Description LIKE '%$zoekwoord%'
OR voornaam LIKE '%$zoekwoord%'
OR achternaam LIKE '%$zoekwoord%'
ORDER BY spelerscode
- 像 Thorsten Kettner 建议的那样在 WHERE 中进行翻译
这对于评论来说太长了,这确实应该是 Jonny 的回答。但是,答案值得一些解释。
您将新变量定义为 as positie
,您 重命名了 一个已被 from
子句识别的列。您期望 SQL 语句中的其他引用引用新定义。但是,select
中定义的列别名在 select
、from
或 where
子句中的其他任何地方都不可用。 (在 MySQL 中,它们在 group by
、having
和 order by
中可用,但标准仅指定 order by
需要识别它们。)
所以,当你说:
WHERE positie LIKE '%$zoekwoord%'
你真的是在说:
WHERE spelers.positie LIKE '%$zoekwoord%'
你会清楚地认识到这是永远不匹配的。
有很多不同的解决方案:
- A Jonny 建议,只需使用
spelers.positie = 1
。 - 在
where
子句中重复case
逻辑(尽管我认为这很丑陋,所以这是我最不喜欢的解决方案)。 - 使用引用 table 和
join
而不是case
逻辑将职位编号转换为职位名称。 - 使用枚举类型并且在整个代码中只引用名称。
- 使用
having
子句:having positie LIKE '%$zoekwoord%'
。having
子句 可以 引用别名,尽管我仍然会更改别名的名称,以便数字和名称具有不同的值。