无法正确地从两个表中选择记录

时间:2018-04-02 12:08:16

标签: mysql sql

我最初使用此Query,然后最后使用了此Query

##Query[1]
SELECT t.title, p.content, p.version
FROM drafts d
INNER JOIN titles t ON t.id = d.tp_id AND d.t = 1
INNER JOIN posts p ON p.id = d.tp_id AND d.t = 2
WHERE user_id = 1

##Query[2]
SELECT coalesce(p.title, t.title), p.content, p.version
FROM drafts d
INNER JOIN titles t ON t.id = d.tp_id AND d.t = 1
INNER JOIN 
(
  SELECT pt.id, tp.title, pt.content, pt.version 
  FROM posts pt
  INNER JOIN titles tp ON tp.id = pt.tid
) p ON p.id = d.tp_id AND d.t = 2 
WHERE user_id = 1

我想做什么使用Table: drafts来使用

  1. Column: tp_id作为其他Column: id的标识符。

  2. Column: user_id作为用户id 草稿

  3. Column: t作为Tables: titles[t=1], posts[t=2]表从中获取记录的标识符。

  4. Table: posts Column: tid Column: id Table: titles Column: title的{​​{1}}链接用于提取Table: titles

    我希望Table: posts中不显示任何记录(如果不存在),如果tid上的标题与Table: titles相关,则Table: posts不会显示任何记录}}不存在或INNER JOIN的记录不存在,这就是我使用title content version TheTitle null null TheTitle Content1 1 TheTitle Content2 2 TheTitle Content3 3 TheTitle Content4 4 TitleThe Content1 1 TitleThe Content2 2 TitleThe Content3 3 TitleThe Content4 4 的原因。

    但在两个查询中,我都没有得到任何结果。

    这是否正确 table scheme and design 用于两个不同的表的草稿表,而不是每个表一个?

    我期望的结果是这样的

        [table-a]                                        [table-b]
    [id   -   title  ]                          [id   -   table_a_id   -   content  ]
    [1    -   title-1]                          [1    -   1            -   content-1]
    

    一个简单的例子:

    table-a
    1. titlestable-b
    2. content各有titletable-b
    3. {li> table_a_id content列将table-a [table-ab] [user_id - table_col_id - table_letter] [1 - 1 - a ] [1 - 1 - b ] 相关联 table-ab。的标题
      user_id
      1. table-abtable_letter告诉哪个用户会显示记录。
      2. table-abtable_letter = a告诉查询从哪个表中获取数据。
      3. 我希望Query做的是检查table-a并根据它从其他表中获取数据,所以它将是

        1. table_col_id = 1 =>从table-a获取行。
        2. id = 1 =>从result = title-1 WHERE table_letter = b
        3. 中提取行

          table-b

          1. table_col_id = 1 =>从table-b获取行。
          2. id = 1 =>从result = title-1 - content-1 WHERE Final result: id - title - content ------------------------- 1 - title-1 - null 2 - title-1 - content-1
          3. 中提取行

            db.store.setJSON("key", value); //to set value db.store.getJSON("key"); //to get value

            with_items
              - "{{ monit_status_raw.stdout_lines }}"
            

4 个答案:

答案 0 :(得分:1)

执行两个单独的查询(对于t = 1和t = 2)并使用SELECT t.title, null content , null version FROM drafts d INNER JOIN titles t ON t.id = d.tp_id WHERE d.user_id = 1 and d.t = 1 UNION ALL SELECT pt.title, pt.content, pt.version FROM drafts d INNER JOIN ( SELECT p.id, t.title, p.content, p.version FROM posts p INNER JOIN titles t ON t.id = p.tid ) pt ON pt.id = d.tp_id AND d.t = 2 WHERE d.user_id = 1 来组合结果:

{{1}}

答案 1 :(得分:0)

当您使用内部联接时,请检查以下内容:

  1. 两个表格中的公共数据(加入列),如果没有任何共同值,则不会选择任何内容。
  2. 检查用于连接两个表的列的数据类型,如果不是,则应该是相同的
  3. 加入栏中的额外空格。

答案 2 :(得分:0)

加入条件d.t = 1后,d.t = 2没有数据这就是为什么在第二次加入后您没有获得任何数据的原因。请尝试以下查询

SELECT coalesce(p.title, t.title), p.content, p.version
FROM drafts d
INNER JOIN titles t 
ON t.id = d.tp_id 
INNER JOIN 
(
  SELECT pt.id, tp.title, pt.content, pt.version 
  FROM posts pt
  INNER JOIN titles tp 
  ON tp.id = pt.tid
) p 
ON p.id = d.tp_id 
WHERE user_id = 1
AND (d.t = 1 OR d.t = 2)

答案 3 :(得分:0)

这几乎可以产生你的问题。它确实省略了内容和版本的空值。不确定为什么会出现预期的输出。

SELECT 
    if(d.t = 1,tp.title, if(d.t = 2,t.title,"")) as `title`,
    p.content,
    p.version
FROM drafts d
LEFT JOIN titles t ON t.id = d.tp_id AND d.t = 2
LEFT JOIN posts p ON t.id = p.tid
LEFT JOIN titles tp ON tp.id = p.tid AND d.t = 1
WHERE user_id = 1 AND NOT p.content IS NULL

我更改了一些数据,特别是Content1组 - Content4。我添加了#34; a"到前4," b"剩下的。

这里有SQL Fiddle,显示了它的作用。