我在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