MySQL 根据 IF/CASE 语句选择某些行
Posted
技术标签:
【中文标题】MySQL 根据 IF/CASE 语句选择某些行【英文标题】:MySQL SELECTing certain rows depending on IF/CASE statement 【发布时间】:2012-10-23 16:52:02 【问题描述】:以下是我想要做的事情
SELECT id, status, Gid, Uid, note FROM notes LIMIT 10
但状态 ID 可能不同,它需要类似于以下内容
SELECT a.id, a.status, a.Gid, a.Uid, a.note
FROM notes as a
WHERE
IF(a.status < 2, DONT SELECT),
IF(a.status == 2,
(SELECT approved FROM friends WHERE Uid = a.Uid AND Fid = ".$_SESSION['Uid'].")
IF(approved = 1, SELECT ROW, else DONT)
)
IF(a.status == 3, SELECT)
IF(a.status == 4,
(SELECT Gid FROM friends WHERE Uid = a.Uid AND Fid = ".$_SESSION['Uid'].")
IF(Gid == a.Gid, SELECT ROW, else DONT)
ORDER BY id DESC
LIMIT 10
我查找了 CASE 命令,但不知道如何使用它,但我可以看到这样做的方法,但是是的.. 我不确定如何使用。 以上是我正在尝试做的一个示例,a.Uid 可以是不同的 id,所以当状态 == 2 或 4 时,我们需要查看查看用户是已批准的朋友还是在 groupId (Gid )
任何帮助修复此查询将不胜感激。如果需要,我可以稍微更改注释表,因为它尚未投入生产,但不鼓励。不过我愿意接受建议
提前致谢!
【问题讨论】:
控制是否应选择记录的条件属于 WHERE 子句。 我明白,我只是发布了一个示例查询,以了解我所追求的内容。我将“FROM notes”移到 IF 语句上方,并在之后添加了 WHERE 子句。我是仍然不确定如何根据“状态”列选择正确的行 【参考方案1】:我认为这会满足您的需求:
select a.id, a.status, a.Gid, A.Uid, a.note
FROM notes a
LEFT JOIN friends f ON f.Uid = a.Uid AND f.Fid = $_SESSION[Uid]
WHERE (a.status = 2 AND f.approved = 1)
OR a.status = 3
OR (a.status = 4 AND f.Gid = a.Gid)
ORDER BY a.id DESC
LIMIT 10
【讨论】:
实际上使用左连接是有道理的,我现在去测试一下,然后再回复你。感谢您的帮助! 据我所知,它的效果很好!感谢那里的帮助,我正准备在一个简单的连接查询中拔掉头发。我想我没有考虑在 WHERE 子句中使用 OR 哈哈 仅供参考,另一种方法是使用 UNION。有时,如果您在状态列上有索引,则这些在 WHERE 子句中的性能可能比 OR 更好。 是的,我需要状态有一个索引,因为它的主列一直被调用。我还没有在 mysql 中使用 UNION 子句,所以我必须查找如何使用它们以上是关于MySQL 根据 IF/CASE 语句选择某些行的主要内容,如果未能解决你的问题,请参考以下文章
MySQL基础--08---流程控制( IF CASE) 和 游标
SQL nvl 等效 - 没有 if/case 语句 & isnull & coalesce