在' AS'中搜索LIKE柱

时间:2015-01-05 14:33:00

标签: mysql

我有以下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

例如,当我搜索“守护者”时,我想展示所有守护者。 有了这个查询,它没有给我任何结果.. 有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:2)

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

您将新变量定义为as positie,您已重命名已由from子句识别的列。您期望SQL语句中的其他引用引用新定义。但是,select中的selectfromwhere子句中的其他任何位置都无法使用group by中定义的列别名。 (在MySQL中,它们在havingorder byorder by中可用,但标准仅指定WHERE positie LIKE '%$zoekwoord%' 需要识别它们。)

所以,当你说:

WHERE spelers.positie LIKE '%$zoekwoord%'

你真的在说:

spelers.positie = 1

你会清楚地认识到这一点从不匹配。

有许多不同的解决方案:

  • Jonny建议,只需使用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
  1. 像Thorsten Kettner所做的那样翻译