内部联接只有两个条件之一

时间:2015-06-07 04:30:04

标签: mysql

我有两张桌子:

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_datalang = categoriesmain_lang

2 个答案:

答案 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_id2lang2title2,这将是非阿拉伯语(除非它们也是null,在这种情况下,您可以或者可能不想添加WHERE子句来省略这些行。)