从数据库中选择一行中的值是唯一的并且限制为5个最新的行

斯诺克

我有一个图像数据库,图像行使用查看者的最后一个IP更新,并使用当前时间戳更新date_updated列。我正在尝试获取最近查看的5张图像,但是只有每个不同的IP地址,我不希望有人淹没最近查看的结果。

小提琴::http : //sqlfiddle.com/#!2 / d5b05/16

所需的结果:从此数据集中选择所需的结果:

SELECT * FROM `image` ORDER BY `date_updated` DESC;

|   IMAGE | WIDTH | HEIGHT | DATE_ADDED | DATE_UPDATED | UPDATED_BY_IP |
|---------|-------|--------|------------|--------------|---------------|
| 1x1XGY4 |  1920 |   1080 | 1417546414 |   1421712314 |   192.168.0.7 |
| 1x1XGY3 |  1920 |   1080 | 1417546413 |   1421712313 |   192.168.0.7 |
| 1x1XGY2 |  1920 |   1080 | 1417546412 |   1421712312 |  192.168.0.10 |
| 1x1XGY1 |  1920 |   1080 | 1417546411 |   1421712311 |  192.168.0.10 |
| 1oApS54 |  1920 |   1080 | 1417138874 |   1421685474 |   192.168.0.2 |
| 1oApS53 |  1920 |   1080 | 1417138873 |   1421685473 |   192.168.0.2 |
| 1oApS52 |  1920 |   1080 | 1417138872 |   1421685472 |  192.168.0.10 |
| 1oApS51 |  1920 |   1080 | 1417138871 |   1421685471 |  192.168.0.10 |
| 1ydhtQ4 |  1920 |   1080 | 1421460434 |   1421685154 |   192.168.0.6 |
| 1ydhtQ3 |  1920 |   1080 | 1421460433 |   1421685153 |   192.168.0.7 |
| 1ydhtQ2 |  1920 |   1080 | 1421460432 |   1421685152 |  192.168.0.10 |
| 1ydhtQ1 |  1920 |   1080 | 1421460431 |   1421685151 |   192.168.0.5 |
| 1WyQib4 |  1920 |   1080 | 1420869354 |   1421634384 |   192.168.0.8 |
| 1WyQib3 |  1920 |   1080 | 1420869353 |   1421634383 |   192.168.0.2 |
| 1WyQib2 |  1920 |   1080 | 1420869352 |   1421634382 |   192.168.0.3 |
| 1WyQib1 |  1920 |   1080 | 1420869351 |   1421634381 |  192.168.0.10 |
| 1izDqg4 |  1920 |   1080 | 1416948144 |   1421608564 |   192.168.0.2 |
| 1izDqg3 |  1920 |   1080 | 1416948143 |   1421608563 |   192.168.0.2 |
| 1izDqg2 |  1920 |   1080 | 1416948142 |   1421608562 |   192.168.0.5 |
| 1izDqg1 |  1920 |   1080 | 1416948141 |   1421608561 |  192.168.0.10 |

用伪选择语句:

SELECT * FROM image在哪里update_by_ip是DISTINCT ORDER BY date_updated DESC LIMIT 5

|   IMAGE | WIDTH | HEIGHT | DATE_ADDED | DATE_UPDATED | UPDATED_BY_IP |
|---------|-------|--------|------------|--------------|---------------|
| 1x1XGY4 |  1920 |   1080 | 1417546414 |   1421712314 |   192.168.0.7 |
| 1x1XGY2 |  1920 |   1080 | 1417546412 |   1421712312 |  192.168.0.10 |
| 1oApS54 |  1920 |   1080 | 1417138874 |   1421685474 |   192.168.0.2 |
| 1ydhtQ4 |  1920 |   1080 | 1421460434 |   1421685154 |   192.168.0.6 |
| 1ydhtQ1 |  1920 |   1080 | 1421460431 |   1421685151 |   192.168.0.5 |

壁橱结果:

我能想到的最好的是:

SELECT DISTINCT updated_by_ip, MAX(date_updated) AS date_updated 
FROM `image` GROUP BY updated_by_ip ORDER BY date_updated DESC LIMIT 5;

这给了我:

| UPDATED_BY_IP | DATE_UPDATED |
|---------------|--------------|
|   192.168.0.7 |   1421712314 |
|  192.168.0.10 |   1421712312 |
|   192.168.0.2 |   1421685474 |
|   192.168.0.6 |   1421685154 |
|   192.168.0.5 |   1421685151 |

我可以做一个

while (SELECT DISTINCT updated_by_ip ...)
{
    $result_rows[] = SELECT * FROM image 
                    WHERE updated_by_ip = query[updated_by_ip] 
                    AND date_updated = query[date_updated] LIMIT 1
}

但是,我希望找到一种无需做大量后期处理和其他查询的方法,而且,由updated_by_ip和date_updated进行选择似乎不太稳定。

谢谢你。

琼斯

要在没有MySQL GROUP BY扩展名的情况下执行此操作,可以尝试以下操作:

首先,使用此子查询从五个不同的IP编号中获取最新的更新时间。

     SELECT updated_by_ip, MAX(date_updated) as date_updated
       FROM image  
      GROUP BY updated_by_ip
      ORDER BY 2 DESC
      LIMIT 5

如果您的表很大,则上的索引(updated_by_ip, date_updated)将有助于提高性能。

然后,将其与主查询连接到该子查询以获取结果。

SELECT i.*
  FROM image i
  JOIN (
         SELECT updated_by_ip, MAX(date_updated) as date_updated
           FROM image  
          GROUP BY updated_by_ip
          ORDER BY 2 DESC
          LIMIT 5
        ) m USING(updated_by_ip, date_updated)
ORDER BY i.date_updated DESC

看到这个:http : //sqlfiddle.com/#!2/d5b05/21/0

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从数据库中选择一行中的值是唯一的并且限制为5个最新值的行

来自分类Dev

如何从两个表中选择不同的值限制为一行

来自分类Dev

从不同表中选择数据限制为10,而另一个表中限制为5

来自分类Dev

从每一行中选择一个单选按钮,然后将其提交到数据库mysqli

来自分类Dev

从数据库中选择唯一值

来自分类Dev

如何使用 PHP 为数据库中的每一行创建一个唯一的页面?

来自分类Dev

结合两个forloop在同一行中获取数据库值

来自分类Dev

结合两个forloop在同一行中获取数据库值

来自分类Dev

使用PHP在mysql数据库中选择下一行

来自分类Dev

在Android中使用rawQuery和rowid从sqlite数据库中选择一行

来自分类Dev

如何从 MySQL 数据库行中选择同一列中包含 3 个以上必需单词的行?

来自分类Dev

从一个表中选择与SQL的另一个表中的相同值相关联的唯一行对

来自分类Dev

根据一行中的值在r中的数据框中选择行

来自分类Dev

使用 Linq 选择前 5 个唯一行

来自分类Dev

将数据库响应限制为5行

来自分类Dev

在SnowFlake Cloud数据库中仅添加唯一行

来自分类Dev

获取表中的最新条目。数据库表的最后一行

来自分类Dev

从一行中的不同行中选择值

来自分类Dev

每个唯一列值限制一行,按最大列值选择

来自分类Dev

分配一个值以从数据库中选择列表(在表中)

来自分类Dev

根据同一行中的另一个值从行中选择某个值

来自分类Dev

我需要一个想法如何从数据库中获得唯一的随机行

来自分类Dev

我的Ajax代码仅从Mysql数据库行中获取一行的值

来自分类Dev

一行的每两个输入保存在单独的数据库行中

来自分类Dev

在 Django 中查询具有一对值的一行的数据库

来自分类Dev

如何只从数据库中选择唯一的项目

来自分类Dev

使用PHP选择数据库中的最后一行不起作用

来自分类Dev

从数据库中选择最高的值,这对于客户名称而言是唯一的?

来自分类Dev

从sqlite数据库中检索一行

Related 相关文章

  1. 1

    从数据库中选择一行中的值是唯一的并且限制为5个最新值的行

  2. 2

    如何从两个表中选择不同的值限制为一行

  3. 3

    从不同表中选择数据限制为10,而另一个表中限制为5

  4. 4

    从每一行中选择一个单选按钮,然后将其提交到数据库mysqli

  5. 5

    从数据库中选择唯一值

  6. 6

    如何使用 PHP 为数据库中的每一行创建一个唯一的页面?

  7. 7

    结合两个forloop在同一行中获取数据库值

  8. 8

    结合两个forloop在同一行中获取数据库值

  9. 9

    使用PHP在mysql数据库中选择下一行

  10. 10

    在Android中使用rawQuery和rowid从sqlite数据库中选择一行

  11. 11

    如何从 MySQL 数据库行中选择同一列中包含 3 个以上必需单词的行?

  12. 12

    从一个表中选择与SQL的另一个表中的相同值相关联的唯一行对

  13. 13

    根据一行中的值在r中的数据框中选择行

  14. 14

    使用 Linq 选择前 5 个唯一行

  15. 15

    将数据库响应限制为5行

  16. 16

    在SnowFlake Cloud数据库中仅添加唯一行

  17. 17

    获取表中的最新条目。数据库表的最后一行

  18. 18

    从一行中的不同行中选择值

  19. 19

    每个唯一列值限制一行,按最大列值选择

  20. 20

    分配一个值以从数据库中选择列表(在表中)

  21. 21

    根据同一行中的另一个值从行中选择某个值

  22. 22

    我需要一个想法如何从数据库中获得唯一的随机行

  23. 23

    我的Ajax代码仅从Mysql数据库行中获取一行的值

  24. 24

    一行的每两个输入保存在单独的数据库行中

  25. 25

    在 Django 中查询具有一对值的一行的数据库

  26. 26

    如何只从数据库中选择唯一的项目

  27. 27

    使用PHP选择数据库中的最后一行不起作用

  28. 28

    从数据库中选择最高的值,这对于客户名称而言是唯一的?

  29. 29

    从sqlite数据库中检索一行

热门标签

归档