我在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答案 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
结合两种结果。
答案 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
之后,因此是子查询。