如何为每个 ID 获取一些数据的结果?

how to get result of some data for every each id?

我有两个 table。一是场所信息。其他事情有一些 url 更新日期数据的信息。

我想获取数据最大值 4(限制 4)url 按 update_date 排序每个 place_id。

  1. 地点table
  id   place_name 
+----+-------------+
  1         a
  2         b
  3         c
  .         .
  .         .
  1. place_url table
  id     place_id          place_url           update_date
+----+-------------+----------------------+-----------------+
  1         1         http://example1.com      2019.01.01
  2         1         http://example2.com      2019.01.02
  3         1         http://example3.com      2019.01.03
  4         2         http://example4.com      2019.01.04
  5         2         http://example5.com      2019.01.06
  6         2         http://example6.com      2019.01.07
  7         2         http://example7.com      2019.01.09
  8         3         http://example8.com      2019.01.11
  .         .                   .                   .
  .         .                   .                   .
  .         .                   .                   .

** 我想得到 url 每个 place_id 有限 4 与 ORDER BY update_date DESC**

 id     place_id          place_url           update_date
+----+-------------+----------------------+-----------------+
  1         1         http://example1.com      2019.01.01
  2         1         http://example2.com      2019.01.02
  3         1         http://example3.com      2019.01.03
  4         2         http://example4.com      2019.01.04
  5         2         http://example5.com      2019.01.06
  6         2         http://example6.com      2019.01.07
  7         2         http://example7.com      2019.01.09

  ..
  ...

基本示例代码如下。

SELECT p.id, pu.place_id, pu.place_url FROM place AS p
    LEFT JOIN place_url AS pu ON pu.place_id = p.id
    WHERE p.id IN (1,2,3) ORDER BY pu.update_date DESC LIMIT 4;



but the result is not limit 4 with order by update_date each of place_id. just limited total result.

您可以尝试使用相关子查询,计算某个地点的较晚记录并检查是否少于四条。

SELECT p1.id,
       pu1.place_id,
       pu1.place_url
       FROM place AS p1
            LEFT JOIN place_url AS pu1
                      ON pu1.place_id = p1.id
                         AND (SELECT count(*)
                                     FROM place_url pu2
                                     WHERE pu2.palace_id = pu1.place_id
                                           AND (pu2.update_date > pu1.update_date
                                                 OR pu2.update_date = pu1.update_date
                                                    AND pu2.id > pu1.id)) < 4
       WHERE p1.id IN (1,
                       2,
                       3)
       ORDER BY pu1.update_date;