2

我想将一个简单的 MySQL 查询从一个表调整到另一个表。第一个查询按预期工作,但第二个修改后的查询未显示预期结果,但我无法弄清楚结构有什么不同。

这个问题与我之前认为已解决的问题有关:

WHERE 条件中的 SQL IF ELSE / CASE 子句

简短地解释了查询应该执行的操作:

我想在 SQL SELECT 中编写一个 WHERE 条件,该条件应该向我显示每个 ID 最多一个结果。但仅当 LANG 为 FR 或 EN 时,它才应显示结果。顶部应该首选 FR,并且仅当 ID 没有可用的 FR 时才应显示 EN 作为替代。所以结果看起来像这样。

这里是工作查询。这是 SQL Fiddle链接

SELECT * FROM `table1`
WHERE ID = 4
AND lang = 'FR'
OR (lang = 'EN' AND ID = 4 NOT IN (SELECT ID FROM table1 WHERE lang = 'FR'))

这是结构相同的查询。这是 SQL Fiddle链接

SELECT * FROM `epf_application_detail`
WHERE application_id = 281656475
AND language_code = 'PL'
OR (language_code = 'EN' AND application_id = 281656475 NOT IN (SELECT application_id FROM `epf_application_detail` WHERE language_code = 'PL'))

如果第二个小提琴可以正常工作,它应该显示

+--------------+----------------+---------------+-----------+
|  export_date | application_id | language_code |    title  |
+--------------+----------------+---------------+-----------+
|1377594004198 | 281656475      | 'EN'          | 'PAC-MAN' |
+--------------+----------------+---------------+-----------+

我绝对不知道有什么区别,所以任何帮助都非常感谢

编辑:最适合我的解决方案(因为我需要将它与 union all 结合起来,并且每个 application_id 都需要一个结果)

SELECT *
FROM `epf_application_detail`
WHERE application_id = 281656475 AND
      (language_code = 'PL' OR
       (language_code = 'EN' AND
        application_id NOT IN (SELECT application_id
                               FROM `epf_application_detail`
                               WHERE language_code = 'PL' and application_id is not null
                              )
       )
      )
4

2 回答 2

5

您的查询失败,因为您正在进行比较并且 not in

SELECT *
FROM `epf_application_detail`
WHERE (application_id = 281656475 AND language_code = 'PL') OR
      (language_code = 'EN' AND
       application_id = 281656475 NOT IN (SELECT application_id
----------------------------------^
                                          FROM `epf_application_detail` WHERE language_code = 'PL'))

MySQL 将进行第一次比较,并将布尔结果转换为整数not in。根据第一个查询的结构,您需要:

SELECT *
FROM `epf_application_detail`
WHERE (application_id = 281656475 AND language_code = 'PL') OR
      (language_code = 'EN' AND
       application_id NOT IN (SELECT application_id
                              FROM `epf_application_detail`
                              WHERE language_code = 'PL' and application_id is not null
                             )
      )

我还添加了application_id is not null,因为NULL会导致NOT IN失败。

编辑:

根据您的评论,这应该捕获您的逻辑:

SELECT *
FROM `epf_application_detail`
WHERE application_id = 281656475 AND
      (language_code = 'PL' OR
       (language_code = 'EN' AND
        application_id NOT IN (SELECT application_id
                               FROM `epf_application_detail`
                               WHERE language_code = 'PL' and application_id is not null
                              )
       )
      )

如果您只从明细表中查找一行,则以下内容要简单得多:

SELECT *
FROM `epf_application_detail`
WHERE application_id = 281656475 AND
      language_code in ('PL', 'EN')
ORDER BY language_code = 'PL' desc
LIMIT 1;

这使用 MySQL 特定的语法。您的问题未标记 MySQL,但确实使用了 MySQL 语法。

于 2013-09-06T16:39:20.423 回答
2

你可以更换

 not IN

 and NOT exists


SELECT * FROM `epf_application_detail`
WHERE application_id = 281656475
AND language_code = 'PL'
OR (language_code = 'EN' AND
    application_id = 281656475 and NOT exists (SELECT application_id FROM `epf_application_detail` WHERE language_code = 'PL'))
于 2013-09-06T16:40:00.713 回答