我在mysql数据库中有三个表,我将加入一个查询以获取id/值对。

   |    A     |       B      |     C         |
   | -------- |--------------|---------------|
   |   id     |  id          |  id           |
   |   name   |  fooId       |  attributeId  |
   |   desc   |  value       |  displayIndex |
   |   ...    |  attributeId |  ...          |

我现在拥有的是:
SELECT C.id, B.value
  FROM  A, B, C
  WHERE A.id = B.attributeId
    AND A.id = C.attributeId
    AND B.fooId = 25
  ORDER BY C.displayIndex

所以基本上我们是通过a连接b和c,以前c表中的一个条目必须在a表中有一个对应的(父)条目。然而,情况将不再如此。C表仍然主要由A表控制,但是,有时我们需要C表中的独立(始终打开)条目。
编辑
我想要B和C中所有与attributeID匹配的记录,但我也想要C.attributeID=-1的任何记录。有人能帮我处理这个问题吗?
编辑2
基于你们的反馈和建议以及一些谷歌搜索,我现在有了这个:
(SELECT C.id, B.value, C.displayIndex
  FROM  B, C
  WHERE B.attributeId = C.attributeId
    AND B.fooId = 25)

UNION

(SELECT C.id, null, C.displayIndex
  FROM C
  WHERE C.attributeId = -1)

ORDER BY 3

有更好的办法吗?工会有什么问题吗?

最佳答案

我已经更新了我的答案,以解决来自OP的编辑。
这将返回所有记录where the attributeId for tables B and C match
使用B.fooId = 25, OR C.attributeId = -1
C.attributeId = -1且表B中没有匹配项时,将返回NULL以代替B.Value,根据OP中的Edit #2,这似乎是可以接受的

SELECT C.Id, B.Value, C.displayIndex
FROM C
LEFT JOIN B ON C.attributeId = B.attributeId
WHERE B.fooId = 25
   OR C.attributeId = -1
ORDER BY C.DisplayIndex ASC

08-06 23:04