如果列有值A,如何获取记录,如果不是则B?

时间:2014-11-21 09:32:00

标签: mysql sql

我在mysql数据库中有一个表。像

+-----+------+------+--------+  
| id  | p_id | lang |  title |
+-----+------+------+--------+  
| 1   |   1  |  en  |  eng1  |
| 2   |   1  |  fr  |  fr1   |
| 3   |   2  |  en  |  eng2  |
+-----+------+------+--------+

我想选择P_id = lang fr的记录。如果任何p_id在fr中没有记录,则选择en的记录。 像

+-----+------+------+--------+  
| id  | p_id | lang |  title |
+-----+------+------+--------+
| 2   |   1  |  fr  |  fr1   |
| 3   |   2  |  en  |  eng2  |
+-----+------+------+--------+

有可能吗?

我正在使用PHP,MySQL和Joomla。

修改: 1:每个p_id可以有超过2行的diff lang,比如看p_id = 1

  +-----+------+------+--------+  
    | id  | p_id | lang |  title |
    +-----+------+------+--------+  
    | 1   |   1  |  en  |  eng1  |
    | 2   |   1  |  fr  |  fr1   |
    | 3   |   2  |  en  |  eng2  |
    | 4   |   1  |  de  |  de1   |
    +-----+------+------+--------+

2:确保每个p_id在lang = en-GB

中都有一个raw

4 个答案:

答案 0 :(得分:1)

SELECT
id, p_id, lang, title
FROM
your_table
WHERE lang IN ('fr', 'en')
ORDER BY lang = 'fr' DESC
/*optionally*/
LIMIT 1;

lang = 'fr'中的order by会返回1或0,无论是真还是假。这可以确保fr记录是第一个。

或者像这样:

SELECT SQL_CALC_FOUND_ROWS
id, p_id, lang, title
FROM
your_table
WHERE lang ='fr'
UNION ALL
SELECT
id, p_id, lang, title
FROM
your_table
WHERE lang ='en'
AND FOUND_ROWS() = 0;

仅当第一个查询没有找到行时,才会在union中执行第二个查询。

答案 1 :(得分:1)

Mysql查询(未经测试)

SELECT DISTINCT a.p_id
FROM myTable a
WHERE a.lang = 'fr'
UNION
SELECT DISTINCT b.p_id
FROM myTable b
WHERE b.lang = 'en'
AND NOT EXISTS
(
 SELECT 1
 FROM myTable c
 WHERE c.lang = 'fr'
 AND c.p_id = b.p_id
)

我接受所有fr行然后我添加所有不存在fr行的en。

答案 2 :(得分:1)

以下查询选择所有带有lang = fr:

的记录
SELECT *
FROM content
WHERE lang = 'fr'

以下查询选择lang = en的所有记录,并且不存在相应的fr记录:

SELECT en.*
FROM content AS en
LEFT JOIN content AS fr ON en.p_id = fr.p_id AND en.id <> fr.id AND fr.lang = 'fr'
WHERE en.lang = 'en' AND fr.id IS NULL

使用UNION ALL结合两种结果。

SQL Fiddle

答案 3 :(得分:0)

虽然它适用于您发布的数据集,但需要进行一些调整。

小提琴 - http://sqlfiddle.com/#!2/c9261f/4

上面fancyPants发布了一点修改后的答案。

SELECT id, p_id, lang, title
   FROM `test`
WHERE lang ='fr'
UNION ALL
SELECT id, p_id, lang, title
   FROM `test`
WHERE lang ='en'
AND id > (SELECT id
   FROM `test`
WHERE lang ='fr');

根据我的理解,p_id与lang = en应该在lang = fr之后,因此是子查询。