【问题标题】:Query with different conditions in same table with same columns同列同表不同条件查询
【发布时间】:2018-12-11 15:19:51
【问题描述】:

我有这张表(url_table):

+----+---------------+-------------+
| id | language_code |     url     |
+----+---------------+-------------+
| 60 | de            | german_url  |
| 60 | en            | english_url |
| 60 | fr            | france_url  |
| 60 | es            | spanish_url |
+----+---------------+-------------+

我想将这两个查询合二为一:

SELECT url FROM url_table WHERE id = 60 AND language_code = 'de';
SELECT url FROM url_table WHERE id = 60 AND language_code = 'en';

结果应该是德语和英语的 url,但重命名为 url_de 和 url_en:

url_de: german_url
url_en: english_url

【问题讨论】:

    标签: mysql sql select conditional-statements where


    【解决方案1】:

    你可以尝试使用in

    SELECT url 
    FROM url_table 
    WHERE id = 60 AND language_code in ('de','en');
    

    根据您的预期结果,您可以尝试使用concat 函数。

    查询 #1

    SELECT concat('url_',language_code ,':',url)
    FROM url_table
    WHERE id = 60 AND language_code in ('de','en');
    
    | concat('url_',language_code ,':',url) |
    | ------------------------------------- |
    | url_de:german_url                     |
    | url_en:english_url                    |
    

    View on DB Fiddle

    【讨论】:

      【解决方案2】:

      您可以使用OR

      SELECT url FROM url_table WHERE id = 60 AND language_code = 'de' OR language_code = 'en' ;
      

      【讨论】:

      • 小心,这不符合要求。您在两行中都有相同的url 列:“但重命名为 url_de 和 url_en,但重命名为 url_de 和 url_en”
      【解决方案3】:

      不确定语法是否完美,但可能是这样的。

      SELECT 
        u.id 
      , url_de = (SELECT URL FROM url_table u2 WHERE u2.ID = u.id AND u2.language_code ='de')
      , url_en = (SELECT URL FROM url_table u2 WHERE u2.ID = u.id AND u2.language_code ='de')
      FROM url_table u
      WHERE u.id = 60
      

      【讨论】:

        【解决方案4】:

        我认为你想要聚合或连接:

        SELECT MAX(CASE WHEN language_code = 'de' THEN url END) as url_de,
               MAX(CASE WHEN language_code = 'en' THEN url END) as url_en      
        FROM url_table
        WHERE id = 60 AND language_code IN ('de', 'en')
        

        如果您使用group by,这将适用于任意数量的id

        SELECT id,
               MAX(CASE WHEN language_code = 'de' THEN url END) as url_de,
               MAX(CASE WHEN language_code = 'en' THEN url END) as url_en      
        FROM url_table
        WHERE language_code IN ('de', 'en')
        GROUP BY id;
        

        您也可以使用自联接:

        select de.url as url_de, en.url as url_en
        from url_table de join
             url_table en
             on de.id = en.id and
                de.language_code = 'de' and
                en.language_code = 'en'
        where de.id = 60;
        

        但是,如果您没有两种语言的行,这会变得很棘手,这就是我推荐 group by 方法的原因。

        【讨论】:

          【解决方案5】:

          试试这个

           SELECT concat('url_',language_code ,':  ',url) As url
           FROM url_table
           WHERE id = 60 AND (language_code = 'de' OR language_code = 'en');
          

          输出:

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-06-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多