在 '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
  1. 像 Thorsten Kettner 建议的那样在 WHERE 中进行翻译

这对于评论来说太长了,这确实应该是 Jonny 的回答。但是,答案值得一些解释。

您将新变量定义为 as positie,您 重命名了 一个已被 from 子句识别的列。您期望 SQL 语句中的其他引用引用新定义。但是,select 中定义的列别名在 selectfromwhere 子句中的其他任何地方都不可用。 (在 MySQL 中,它们在 group byhavingorder 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 子句 可以 引用别名,尽管我仍然会更改别名的名称,以便数字和名称具有不同的值。