0

我的数据库有问题。我有三个相应的表,其中我在第一个中保存一些页面,在第二个中保存一些字段。第三个是包含页面中所有字段内容的表格。

表:

  • 页面(PageID,名称)

  • 字段(字段 ID,字段名称);

  • 页面字段(PageFieldID、FieldID、PageID)

  • pagefieldcontents(PageFieldContentID、PageFieldID、FieldID、PageID、内容)

我需要确保,即使表“pagefields”中的字段没有值,但如果该字段与页面相关(在 pagefields 表中),它将作为具有值的行返回作为一个空字符串。

我现在正在做的事情如下:

SELECT
    pfc.ContentID as PFC_ContentID,
    pfc.Content as PFC_FieldContent,
    pfc.FieldID as PFC_FieldID
FROM
    pagesfieldcontents pfc
INNER JOIN
    pagefields pf
    ON pf.PageID = pfc.PageID
INNER JOIN
    fields ptf
    ON pf.FieldID = ptf.FieldID
INNER JOIN
    pages p
    ON p.PageID = pf.PageID
WHERE
    (some where-statement)
ORDER BY
    somefield desc

希望你能理解我的问题——祝你有美好的一天。

4

1 回答 1

1

INNER JOIN要求连接表中有一行,才能返回第一个 tabke 的行。但是你可能有字体有内容的字段,你希望那些返回......

将所有 INNER 联接更改为 LEFT 联接:

SELECT
  pfc.ContentID as PFC_ContentID,
  pfc.Content as PFC_FieldContent,
  pfc.FieldID as PFC_FieldID
FROM pages p
LEFT JOIN pagefields pf
  ON p.PageID = pf.PageID
LEFT JOIN fields ptf
  ON pf.FieldID = ptf.FieldID
LEFT JOIN pagesfieldcontents pfc
  ON p.PageID = pfc.PageID
  AND pf.FieldID = pfc.FieldID
WHERE some where-statement
ORDER BY somefield desc

我还重新排列了表顺序和连接条件,我猜你需要什么。

于 2013-07-27T21:32:46.703 回答