从一个表获取密钥和从另一个mysql获取值

时间:2015-01-30 11:05:38

标签: mysql

我一整天都在寻找答案,我简单无法破解它。我有三张桌子:

Keys
-------------------
| ID  | name      |
-------------------
| 1   | title     |
-------------------
| 2   | text      |
-------------------

第一个表包含组成页面的键列表。

Values
---------------------------------
| ID  | value      | key | page |
---------------------------------
| 1   | 'My title' | 1   | 1    |
---------------------------------
| 2   | 'Content'  | 2   | 1    |
---------------------------------
| 1   | 'MyTitle2' | 1   | 2    |
---------------------------------

第二个是键的值列表,与它们所在的页面相关

Pages
--------------------
| ID  | name       |
--------------------
| 1   | 'A page'   |
--------------------
| 2   | 'Another'  |
--------------------

第三个是将它们组合在一起的页面列表。

当我请求页面时,无论上表中存在哪些值,我都希望取回所有键。但我确实希望找回它们存在的列的值。

我尝试了很多东西,但是他们似乎都没有给我一个保证完整的密钥列表,其中填写了潜在的值。

我尝试的第一件事是返回所有正确或非NULL的键,如下:

SELECT 
    *
FROM Keys k
LEFT JOIN Values v
ON k.id = v.key
WHERE (v.page = 1
OR v.page IS NULL)

我想

1. Get all keys
2. Left Join them with values
3. Filter out the keys that don't belong to this page

但是,一旦Value数组中有数据,无论页面ID如何,左连接都将连接,然后过滤掉不匹配,留下 no matches 。我希望它能将空键返回给我。

我也尝试了IN关键字,但我似乎也没有取得任何成功(可能因为此时我觉得相当混乱)。

所以我的问题是我可以返回带有值的键列表(如果它们存在于另一个表中并符合某些条件)吗?

1 个答案:

答案 0 :(得分:0)

谢谢你堆叠溢出,因为输入问题导致我重新制定并得出结果(它让我难以忍受了好几天):

SELECT 
        *
FROM Keys k
LEFT JOIN 
(SELECT * FROM Values v2 WHERE v2.page = 1) as v
ON k.id = v.key

显然你可以LEFT JOIN任何(因为缺少更好的单词和更多的知识来描述它)'数组'的结果好像它本身就是一个表,所以你可以有条件地选择值。如果它们不存在,则左连接返回空结果,但仍按原样返回键。