簡體   English   中英

從表中獲取字段x的值最大的行

[英]get rows from a table where value of field x is maximum

我在mysql數據庫中有兩個表myTablemyTable2

CREATE TABLE myTable (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    number INT,
    version INT, 
    date DATE 
) ENGINE MyISAM;

INSERT INTO myTable
    (`id`, `number`, `version`, `date`)
VALUES
    (1, '123', '1', '2016-01-12'),
    (2, '123', '2', '2016-01-13'),
    (3, '124', '1', '2016-01-14'),
    (4, '124', '2', '2016-01-15'),
    (5, '124', '3', '2016-01-16'),
    (6, '125', '1', '2016-01-17')
;

CREATE TABLE myTable2 (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    myTable_id INT
) ENGINE MyISAM;

INSERT INTO myTable2
    (`id`, `myTable_id`)
VALUES
    (1, 1),
    (2, 1),
    (3, 2),
    (4, 2),
    (5, 3),
    (6, 3),
    (7, 4),
    (8, 4),
    (9, 4),
    (10, 5),
    (11, 6)
;

現場myTable2.myTable_idmyTable.Id的外鍵。

我想獲取myTable中的所有行,其中myTable2.myTable_id = myTable.IdmyTable中字段版本的值是myTable中字段編號的每個對應值的最大值

我試過這樣的事情:

SELECT 
    * 
FROM 
    myTable, 
    myTable2 
WHERE 
    myTable.version = (SELECT MAX(myTable.version) FROM myTable)

但是上面的查詢沒有返回正確的數據。 正確的查詢應輸出:

Id     number    version    date
2      123       2          2016-01-13
5      124       3          2016-01-16
6      125       1          2016-01-17

請幫忙!

一種方法是在派生表中獲取myTable中每個數字的最大版本並加入:

SELECT DISTINCT 
    m.* 
FROM 
    myTable m
JOIN
    myTable2 m2 ON m.id = m2.myTable_id
JOIN
    (
    SELECT number, MAX(version) AS max_version 
    FROM myTable
    GROUP BY number
    ) AS derived_table
 ON m.number  = derived_table.number 
AND m.version = derived_table.max_version

使用您的示例數據,會產生如下結果:

id  number  version date
6   125     1       2016-01-17
5   124     3       2016-01-16
2   123     2       2016-01-13

您的查詢在邏輯上是錯誤的。 這是正確的

SELECT 
 * 
FROM 
 myTable, 
 myTable2 
WHERE 
 (myTable.version,myTable.number) in 
  (SELECT MAX(myTable.version),number FROM myTable group by number)
 and myTable.id=myTable2.id

這是sqlfiddle http://sqlfiddle.com/#!9/74a67/4/0

這是針對上一個編輯過的問題發布的查詢

SELECT * FROM myTable 
inner join myTable2 on myTable.id = myTable2.mytable_id
WHERE (version, number) in 
  (SELECT MAX(version), number FROM myTable group by number)

使用子查詢嘗試此解決方案簡單如下:

# Selecting desired result..
SELECT t1.id, t1.number, t1.version, t1.date 
FROM myTable As t1 JOIN
    # subquery to select max version and its corresponding
    # number form myTable
    (SELECT number, max(version) As max_ver FROM myTable
        GROUP BY number
    ) As t2 ON  t1.number = t2.number and t1.version = t2.max_ver

# Now checking for foreign key..
WHERE t1.id IN (SELECT mytable_id FROM myTable2);

有用嗎..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM