如何使用 MYSQL 中的 CASE 语句根据条件从结果中 select 一行?
how to use CASE statement in MYSQL to select a row from results based on condition?
我是 sql 的新手。我有一个 SELECT 查询 returns 2 行有一个 rid(两行中有 1 个)和一个具有二进制值 0 或 1 的路径列 我想使用 CASE 语句,这样它将 SELECT 基于条件 s1.pid < s2.pid THEN (SELECT S2.rid WHERE r.path = 0) ELSE (SELECT S2.rid WHERE r.path=1 )
的第一个查询结果的一行
下面的代码 returns 两行带有 rid 1 和路径 0 和 1 我如何编写 case 语句?我不知道正确的语法。
架构:database schema
- stopno rid busno pid 总线键路径
4 1 1111 4 键 1 0
4 1 2222 4 键 2 1
这是我从 运行 第一次查询得到的结果,现在我想 select 根据条件 s1.pid< s2.pid 然后 select 行,其中 path = 0 否则我该怎么做?
$sql="SELECT s2.stopno, s2.rid, busno, s2.pid, buskey, `path`
FROM `stop` s2
INNER JOIN `route` r ON s2.rid = r.rid
INNER JOIN bus b ON r.bid = b.bid
INNER JOIN place p ON s2.pid = p.pid
WHERE p.place = 'place2'
AND s2.rid IN (SELECT s1.rid
FROM `stop` s1
INNER JOIN `route` r ON s1.rid = r.rid
INNER JOIN bus b ON r.bid = b.bid
INNER JOIN place p ON s1.pid = p.pid
AND p.place = 'place1')
";
我试过了,但它给我错误
'field list' 中的未知列 's2.pid'。似乎我无法在外部查询中访问内部子查询别名,或者我做错了吗? s2的范围是什么?有什么解决办法吗?
$sql=" SELECT (CASE
WHEN s2.pid > s1.pid
THEN (SELECT s3.rid
FROM `stop` s3
INNER JOIN `route` r ON s3.rid = r.rid
INNER JOIN bus b ON r.bid = b.bid
INNER JOIN place p ON s3.pid = p.pid
WHERE s3.rid IN
(SELECT s2.rid
FROM `stop` s2
INNER JOIN `route` r ON s2.rid = r.rid
INNER JOIN bus b ON r.bid = b.bid
INNER JOIN place p ON s2.pid = p.pid
WHERE p.place = 'place2'
AND s2.rid IN
(SELECT s1.rid
FROM `stop` s1
INNER JOIN `route` r ON s1.rid = r.rid
INNER JOIN bus b ON r.bid = b.bid
INNER JOIN place p ON s1.pid = p.pid
AND p.place = 'place1'))
AND r.path = '0')
ELSE (SELECT s3.rid
FROM `stop` s3
INNER JOIN `route` r ON s3.rid = r.rid
INNER JOIN bus b ON r.bid = b.bid
INNER JOIN place p ON s3.pid = p.pid
WHERE s3.rid IN
(SELECT s2.rid
FROM `stop` s2
INNER JOIN `route` r ON s2.rid = r.rid
INNER JOIN bus b ON r.bid = b.bid
INNER JOIN place p ON s2.pid = p.pid
WHERE p.place = 'place2'
AND s2.rid IN
(SELECT s1.rid
FROM `stop` s1
INNER JOIN `route` r ON s1.rid = r.rid
INNER JOIN bus b ON r.bid = b.bid
INNER JOIN place p ON s1.pid = p.pid
AND p.place = 'place1'))
AND r.path = '1')
END)AS pathfinder
FROM `stop` s
INNER JOIN `route` r ON s.rid = r.rid
INNER JOIN bus b ON r.bid = b.bid
INNER JOIN place p ON s.pid = p.pid
";
编辑 2:
我试过下面的代码,它返回 p1.pid 和 p2.pid 但是在 IF 语句中给出语法错误任何人都可以解决它吗?
$sql="SELECT s2.stopno, s2.rid, b.busno, p1.pid as id1, p2.pid as id2, b.buskey, r.path, p1.place as place1, p2.place as place2,
IF(p1.pid < p2.pid, IF(r.path=0, s2.*, null), IF(r.path=1, s2.*,null))
FROM `stop` s2
JOIN `route` r
ON s2.rid = r.rid
JOIN bus b
ON r.bid = b.bid
JOIN place p1
ON s2.rid = p1.pid
JOIN place p2
ON s2.pid = p2.pid
WHERE
p1.place = 'place1'
AND p2.place = 'place 2'
";
你的描述真是令人费解。
无论如何,我试图重写查询。
而不是使用
AND s2.rid IN (
SELECT s1.rid
我使用了具有相同 stop
table 的自连接并将其别名为 s1
并将连接条件用作 s2.rid = s1.rid and s1.place = 'place1'
$sql="SELECT s2.stopno, s2.rid, b.busno, s2.pid, b.buskey, r.path,
IF(s1.pid < s2.pid, IF(r.path=0, s2.rid, null), IF(r.path=1, s2.rid,null))
FROM `stop` s2, bus b, `route` r, place p, `stop` s1
WHERE s2.rid = r.rid
AND r.bid = b.bid
AND s2.pid = p.pid
AND s2.rid = s1.rid and s1.place = 'place1'
AND p.place = 'place2'"
您还可以进一步简化它,而不是使用多个 IF 或 CASE 语句。
s1.pid < s2.pid THEN (SELECT S2.rid WHERE r.path = 0) ELSE (SELECT S2.rid WHERE r.path=1 )
您可以使用 r.path in (0,1)
来定义它
IF(s1.pid < s2.pid), IF(r.path in (0,1),s2.rid, NULL), NULL)
我是 sql 的新手。我有一个 SELECT 查询 returns 2 行有一个 rid(两行中有 1 个)和一个具有二进制值 0 或 1 的路径列 我想使用 CASE 语句,这样它将 SELECT 基于条件 s1.pid < s2.pid THEN (SELECT S2.rid WHERE r.path = 0) ELSE (SELECT S2.rid WHERE r.path=1 )
的第一个查询结果的一行
下面的代码 returns 两行带有 rid 1 和路径 0 和 1 我如何编写 case 语句?我不知道正确的语法。
架构:database schema
- stopno rid busno pid 总线键路径
4 1 1111 4 键 1 0
4 1 2222 4 键 2 1
这是我从 运行 第一次查询得到的结果,现在我想 select 根据条件 s1.pid< s2.pid 然后 select 行,其中 path = 0 否则我该怎么做?
$sql="SELECT s2.stopno, s2.rid, busno, s2.pid, buskey, `path`
FROM `stop` s2
INNER JOIN `route` r ON s2.rid = r.rid
INNER JOIN bus b ON r.bid = b.bid
INNER JOIN place p ON s2.pid = p.pid
WHERE p.place = 'place2'
AND s2.rid IN (SELECT s1.rid
FROM `stop` s1
INNER JOIN `route` r ON s1.rid = r.rid
INNER JOIN bus b ON r.bid = b.bid
INNER JOIN place p ON s1.pid = p.pid
AND p.place = 'place1')
";
我试过了,但它给我错误 'field list' 中的未知列 's2.pid'。似乎我无法在外部查询中访问内部子查询别名,或者我做错了吗? s2的范围是什么?有什么解决办法吗?
$sql=" SELECT (CASE
WHEN s2.pid > s1.pid
THEN (SELECT s3.rid
FROM `stop` s3
INNER JOIN `route` r ON s3.rid = r.rid
INNER JOIN bus b ON r.bid = b.bid
INNER JOIN place p ON s3.pid = p.pid
WHERE s3.rid IN
(SELECT s2.rid
FROM `stop` s2
INNER JOIN `route` r ON s2.rid = r.rid
INNER JOIN bus b ON r.bid = b.bid
INNER JOIN place p ON s2.pid = p.pid
WHERE p.place = 'place2'
AND s2.rid IN
(SELECT s1.rid
FROM `stop` s1
INNER JOIN `route` r ON s1.rid = r.rid
INNER JOIN bus b ON r.bid = b.bid
INNER JOIN place p ON s1.pid = p.pid
AND p.place = 'place1'))
AND r.path = '0')
ELSE (SELECT s3.rid
FROM `stop` s3
INNER JOIN `route` r ON s3.rid = r.rid
INNER JOIN bus b ON r.bid = b.bid
INNER JOIN place p ON s3.pid = p.pid
WHERE s3.rid IN
(SELECT s2.rid
FROM `stop` s2
INNER JOIN `route` r ON s2.rid = r.rid
INNER JOIN bus b ON r.bid = b.bid
INNER JOIN place p ON s2.pid = p.pid
WHERE p.place = 'place2'
AND s2.rid IN
(SELECT s1.rid
FROM `stop` s1
INNER JOIN `route` r ON s1.rid = r.rid
INNER JOIN bus b ON r.bid = b.bid
INNER JOIN place p ON s1.pid = p.pid
AND p.place = 'place1'))
AND r.path = '1')
END)AS pathfinder
FROM `stop` s
INNER JOIN `route` r ON s.rid = r.rid
INNER JOIN bus b ON r.bid = b.bid
INNER JOIN place p ON s.pid = p.pid
";
编辑 2: 我试过下面的代码,它返回 p1.pid 和 p2.pid 但是在 IF 语句中给出语法错误任何人都可以解决它吗?
$sql="SELECT s2.stopno, s2.rid, b.busno, p1.pid as id1, p2.pid as id2, b.buskey, r.path, p1.place as place1, p2.place as place2,
IF(p1.pid < p2.pid, IF(r.path=0, s2.*, null), IF(r.path=1, s2.*,null))
FROM `stop` s2
JOIN `route` r
ON s2.rid = r.rid
JOIN bus b
ON r.bid = b.bid
JOIN place p1
ON s2.rid = p1.pid
JOIN place p2
ON s2.pid = p2.pid
WHERE
p1.place = 'place1'
AND p2.place = 'place 2'
";
你的描述真是令人费解。 无论如何,我试图重写查询。 而不是使用
AND s2.rid IN (
SELECT s1.rid
我使用了具有相同 stop
table 的自连接并将其别名为 s1
并将连接条件用作 s2.rid = s1.rid and s1.place = 'place1'
$sql="SELECT s2.stopno, s2.rid, b.busno, s2.pid, b.buskey, r.path,
IF(s1.pid < s2.pid, IF(r.path=0, s2.rid, null), IF(r.path=1, s2.rid,null))
FROM `stop` s2, bus b, `route` r, place p, `stop` s1
WHERE s2.rid = r.rid
AND r.bid = b.bid
AND s2.pid = p.pid
AND s2.rid = s1.rid and s1.place = 'place1'
AND p.place = 'place2'"
您还可以进一步简化它,而不是使用多个 IF 或 CASE 语句。
s1.pid < s2.pid THEN (SELECT S2.rid WHERE r.path = 0) ELSE (SELECT S2.rid WHERE r.path=1 )
您可以使用 r.path in (0,1)
IF(s1.pid < s2.pid), IF(r.path in (0,1),s2.rid, NULL), NULL)