2010-11-10 154 views
0

如果我有下面的查询选择论坛板,但board表包含列mirror_board_id。我可以修改一个基本的选择查询,如果mirror_board_id > 0它会SELECT * FROM board WHERE board_id = mirror_board_id什么的。目前我使用2个查询来做到这一点,但是这是一个有点查询密集型...根据列值选择另一行

SELECT * FROM board WHERE category_id = 7 AND board_id = 0 

更新

SELECT * FROM board WHERE category_id = 7 AND 
          (
            (
             mirror_board_id > 0 
             AND board_id = mirror_board_id 
            ) 
           OR board_id = 0 
          ) AND 
          display = 1 ORDER BY `order` ASC 

这回错了板在列表中,它实际上不是返回镜板,但原板,其中mirror_board_id > 0

回答

4

从逻辑上讲,它是:

SELECT * 
FROM board 
WHERE (mirror_board_id > 0 and board_id = mirror_board_id) 
    or board_id = 0 

这可以更简洁地写为:

SELECT * 
FROM board 
WHERE board_id = coalesce(mirror_board_id, 0) 
+0

我可以申请索引与此有关加快步伐?索引'board_id'和'mirror_board_id'分开就够了吗? – Webnet 2010-11-10 16:23:34

+0

由于您正在检查每一行,因此在这种情况下索引是否会有所帮助并不明确。测试并看到... – RedFilter 2010-11-10 16:36:42

+0

它实际上不工作,因为我认为它应该... – Webnet 2010-11-11 01:33:06

相关问题