我有两张桌子:
1 - 类别
+--------+----------+
| id | main_lang|
+--------+----------+
| 1 | ar |
| 2 | en |
| 3 | en |
+--------+----------+
2 - categories_data
+--------+----------+-----------+--------
| data_id| lang | cat_id | title
+--------+----------+-------------------
| 1 | ar | 1 | عنوان 1
| 2 | en | 1 | title 1
| 3 | en | 2 | title 2
| 4 | en | 3 | title 3
+--------+----------+-------------------
现在,我想列出所有类别,加入categories_data
。lang = ar,如果该加入返回null,则加入categories_data
。lang
= categories
。main_lang
。
答案 0 :(得分:0)
乍一看,您可能希望使用存储过程和临时表来开发您尝试实现的结果。虽然内联CASE或ISNULL可能有效,但效率很低。
答案 1 :(得分:0)
您可以使用不同的条件外连接categories_data两次:
SELECT c.*, cd.*, cd2.data_id AS data_id2, cd2.lang AS lang2, cd2.title AS title2
FROM categories c
LEFT JOIN categories_data cd ON cd.cat_id = c.id AND cd.lang = 'ar'
LEFT JOIN categories_data cd2 ON cd.cat_id = c.id AND cd2.lang = c.main_lang AND cd2.lang != 'ar';
处理行时,首先需要测试data_id
是否存在(这意味着阿拉伯语中存在数据行)。如果data_id
为空,则使用data_id2
,lang2
和title2
,这将是非阿拉伯语(除非它们也是null,在这种情况下,您可以或者可能不想添加WHERE
子句来省略这些行。)