我有以下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
例如,当我搜索“守护者”时,我想展示所有守护者。 有了这个查询,它没有给我任何结果.. 有没有办法实现这个目标?
答案 0 :(得分:2)
这对评论来说太长了,而且确实应该是Jonny的回答。但是,答案值得一些解释。
您将新变量定义为as positie
,您已重命名已由from
子句识别的列。您期望SQL语句中的其他引用引用新定义。但是,select
中的select
,from
或where
子句中的其他任何位置都无法使用group by
中定义的列别名。 (在MySQL中,它们在having
,order by
和order by
中可用,但标准仅指定WHERE positie LIKE '%$zoekwoord%'
需要识别它们。)
所以,当你说:
WHERE spelers.positie LIKE '%$zoekwoord%'
你真的在说:
spelers.positie = 1
你会清楚地认识到这一点从不匹配。
有许多不同的解决方案:
case
。where
子句中的join
逻辑(虽然我认为这很难看,所以这是我最不喜欢的解决方案)。case
代替having
逻辑将位置编号转换为位置名称。having positie LIKE '%$zoekwoord%'
子句:having
。 {{1}}子句可以引用别名,但我仍然会更改别名的名称,因此数字和名称具有不同的值。答案 1 :(得分:1)
因此,当您搜索Keeper时,您希望查询显示positie 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;
只是一个侧面评论:有一个表位可能是好的,而不是分泌地知道1表示守门员而2表示防守者并且必须在每个其他查询中记住这一点并且永远不要混淆它们。
答案 2 :(得分:1)
一些解决方案:
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:创建“翻译表”......
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