簡體   English   中英

獲取按 id 分組的 mySQL 查詢的值

[英]Get value of mySQL query grouped by id

我想知道解決以下查詢的有效方法。 基本上我有以下兩個類

CREATE TABLE `example`.`doc` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `uuid` INT NOT NULL,
    `creator` VARCHAR(32) NOT NULL,
    PRIMARY KEY (`id`);

CREATE TABLE `example`.`pic` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `docuuid` INT NOT NULL,
    `taken_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
    `lat` DECIMAL(3,10),
    `lon` DECIMAL(3,10),
    PRIMARY KEY (`id`);

這兩個表是通過 uuid 關聯的(我知道這不是鏈接兩個表的最佳主意,但表是這樣的)。 uuid 每個文檔都是唯一的。 使用以下查詢

SELECT
    `doc`.`id` AS `docId`,
    `doc`.`uuid` AS `uuid`,
    `doc`.`creator` AS `creator`,
    COUNT(`pic`.`id`) AS `pics`,
    MIN(`pic`.`taken_at`) AS `min_date`,
    MAX(`pic`.`taken_at`) AS `max_date`
FROM
    `doc` INNER JOIN
    `pic` ON (`doc`.`uuid` = `pic`.`docuuid`)
WHERE (
    `pic`.`docuuid` IS NOT NULL AND
    `doc`.`uuid` IS NOT NULL)
GROUP BY `doc`.`uuid`

我得到,對於每個文檔,女巫第一張和最后一張照片的拍攝日期。 此外,我想在此查詢中獲取每個文檔的第一張和最后一張照片的緯度和經度。

例如,如果我有

doc1 = (id=0, uuid=1)
doc2 = (id=1, uuid=2)
pic1 = (taken_at=2021-01-01, docuuid=1, lat=1, lon=2)
pic2 = (taken_at=2021-01-02, docuuid=1, lat=3, lon=4)
pic3 = (taken_at=2021-01-03, docuuid=2, lat=5, lon=6)
pic4 = (taken_at=2021-01-04, docuuid=2, lat=7, lon=8)
pic5 = (taken_at=2021-01-05, docuuid=2, lat=9, lon=10)

然后我想得到 doc1 minLat=1, minLon=2, maxLat=3, maxLon=4 和 doc2 minLat=5, minLon=6, maxLat=9, maxLon=10

您可以通過將當前查詢的結果與pics表連接並提取每個pic所需的詳細信息來繼續,我在下面包含了一個示例:

SELECT
    t.*,
    earliest_pic.lat as minLat,
    earliest_pic.lon as minLon,
    latest_pic.lat as maxLat,
    latest_pic.lon as maxLon
FROM
    (
SELECT
    `doc`.`id` AS `docId`,
    `doc`.`uuid` AS `uuid`,
    `doc`.`creator` AS `creator`,
    COUNT(`pic`.`id`) AS `pics`,
    MIN(`pic`.`taken_at`) AS `min_date`,
    MAX(`pic`.`taken_at`) AS `max_date`
FROM
    `doc` INNER JOIN
    `pic` ON (`doc`.`uuid` = `pic`.`docuuid`)
GROUP BY `doc`.`uuid`
) AS t 
INNER JOIN `pic` as earliest_pic ON earliest_pic.taken_at = t.min_date AND
                                    earliest_pic.docuuid = t.docId
INNER JOIN `pic` as latest_pic ON   latest_pic.taken_at = t.max_date AND
                                    latest_pic.docuuid = t.docId

讓我知道這是否適合您

暫無
暫無

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

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