MySQL获取结果的最大ID,除非列中的值等于1
我知道如何获取最大ID。这很简单。但我有一种情况,MaxID可以是值为1的行。例子。。我有以下表格:MySQL获取结果的最大ID,除非列中的值等于1,mysql,Mysql,我知道如何获取最大ID。这很简单。但我有一种情况,MaxID可以是值为1的行。例子。。我有以下表格: CREATE TEMPORARY TABLE people ( id INT NOT NULL ,NAME VARCHAR(50) NOT NULL ); INSERT INTO people (id, NAME) VALUES (1, 'tony'); INSERT INTO people (id, NAME) VALUES (2, 'dave'); INSERT I
CREATE TEMPORARY TABLE people (
id INT NOT NULL
,NAME VARCHAR(50) NOT NULL
);
INSERT INTO people (id, NAME) VALUES (1, 'tony');
INSERT INTO people (id, NAME) VALUES (2, 'dave');
INSERT INTO people (id, NAME) VALUES (3, 'dan');
CREATE TEMPORARY TABLE orders (
id INT NOT NULL
,peopleid INT NOT NULL
,VALUE INT
);
INSERT INTO orders (id, peopleid, VALUE) VALUES (1, 1, NULL);
INSERT INTO orders (id, peopleid, VALUE) VALUES (2, 1, 1);
INSERT INTO orders (id, peopleid, VALUE) VALUES (3, 1, NULL);
INSERT INTO orders (id, peopleid, VALUE) VALUES (4, 2, NULL);
INSERT INTO orders (id, peopleid, VALUE) VALUES (5, 2, NULL);
INSERT INTO orders (id, peopleid, VALUE) VALUES (6, 2, NULL);
INSERT INTO orders (id, peopleid, VALUE) VALUES (7, 2, NULL);
INSERT INTO orders (id, peopleid, VALUE) VALUES (8, 1, NULL);
INSERT INTO orders (id, peopleid, VALUE) VALUES (9, 2, NULL);
当我运行查询时:
SELECT * FROM people AS p
LEFT JOIN orders AS o ON o.peopleid = p.id
我得到的结果是:
id name id peopleid value
1 tony 1 1 null
1 tony 2 1 1
1 tony 3 1 null
1 tony 8 1 null
2 dave 4 2 null
2 dave 5 2 null
2 dave 6 2 null
2 dave 7 2 null
2 dave 9 2 null
3 dan null null null
我需要结果
id name id peopleid value
1 tony 2 1 1
2 dave 9 2 null
3 dan null null null
最终:
SELECT people.id,people.NAME,orders.id,orders.VALUE
FROM people
LEFT JOIN orders
ON orders.peopleid = people.id
LEFT JOIN orders checkbigger
ON checkbigger.peopleid = people.id
AND (
(
checkbigger.id > orders.id
AND orders.value <=> checkbigger.value
)
OR
(
orders.value IS NULL AND checkbigger.value IS NOT NULL
)
)
WHERE checkbigger.id IS NULL;
选择people.id、people.NAME、orders.id、orders.VALUE
来自人们
左连接命令
ON orders.peopleid=people.id
左连接命令检查更大
在checkbiger.peopleid=people.id上
及(
(
选中biger.id>orders.id
和订单。价值检查更大。价值
)
或
(
orders.value为NULL,checkbiger.value不为NULL
)
)
其中checkbiger.id为空;
最终:
SELECT people.id,people.NAME,orders.id,orders.VALUE
FROM people
LEFT JOIN orders
ON orders.peopleid = people.id
LEFT JOIN orders checkbigger
ON checkbigger.peopleid = people.id
AND (
(
checkbigger.id > orders.id
AND orders.value <=> checkbigger.value
)
OR
(
orders.value IS NULL AND checkbigger.value IS NOT NULL
)
)
WHERE checkbigger.id IS NULL;
选择people.id、people.NAME、orders.id、orders.VALUE
来自人们
左连接命令
ON orders.peopleid=people.id
左连接命令检查更大
在checkbiger.peopleid=people.id上
及(
(
选中biger.id>orders.id
和订单。价值检查更大。价值
)
或
(
orders.value为NULL,checkbiger.value不为NULL
)
)
其中checkbiger.id为空;
这将在不使用限制的情况下工作。如果没有value=1
行,第一个MAX
将为空,因此合并
返回第二个MAX
。如果有value=1
行,则第一个MAX
将非空,因此返回
SELECT
COALESCE(
MAX(CASE WHEN value = 1 THEN id END),
MAX(CASE WHEN value IS NULL THEN id END))
FROM a
这将在不使用限制的情况下工作。如果没有value=1
行,第一个MAX
将为空,因此合并
返回第二个MAX
。如果有value=1
行,则第一个MAX
将非空,因此返回
SELECT
COALESCE(
MAX(CASE WHEN value = 1 THEN id END),
MAX(CASE WHEN value IS NULL THEN id END))
FROM a
我将此表用作联接,因此我无法执行限制1。将实际查询添加到您的问题中,然后我们将查看是否可以在联接中获得它,或者是否需要子查询。好的。。我用两个表格更新了问题。。我会提出这个问题。。但这是错误的。。很明显我为什么要添加这个问题。。哈哈,即使是一个错误的查询也很可能清楚地表明了意图。我拼凑了一些(未经测试的!)查询,这些查询可能会满足您的要求。好吧。。我已经添加了表和一个非常基本的查询。你的例子对我不起作用,因为它需要是一个完全的左连接。。很抱歉,一开始没有发布此内容。我将此表用作联接,因此我无法执行限制1。然后将您的实际查询添加到您的问题中,我们将查看是否可以在联接中获得它,或者是否需要子查询。好的。。我用两个表格更新了问题。。我会提出这个问题。。但这是错误的。。很明显我为什么要添加这个问题。。哈哈,即使是一个错误的查询也很可能清楚地表明了意图。我拼凑了一些(未经测试的!)查询,这些查询可能会满足您的要求。好吧。。我已经添加了表和一个非常基本的查询。你的例子对我不起作用,因为它需要是一个完全的左连接。。很抱歉,一开始我没有发布这个。。