从数据库中选择一行中的值是唯一的并且限制为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 where whereupdated_by_ip is 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

从数据库中选择唯一值

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何从数据帧每一行的一系列数字中选择特定值

来自分类Dev

从不同的行中选择唯一的随机值

来自分类Dev

MySQL将记录数限制为一列5个唯一值

来自分类Dev

如何从任何hstore值中选择一行?

来自分类Dev

从多行中选择一行作为默认值

来自分类Dev

在熊猫的DataFrame中选择第一行的值

来自分类Dev

MySQL在一行中选择多个ID值

来自分类Dev

在熊猫的DataFrame中选择第一行的值

来自分类Dev

Javascript仅从表的第一行中选择值

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

    从数据库中选择唯一值

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

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

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

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

  19. 19

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

  20. 20

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

  21. 21

    如何从数据帧每一行的一系列数字中选择特定值

  22. 22

    从不同的行中选择唯一的随机值

  23. 23

    MySQL将记录数限制为一列5个唯一值

  24. 24

    如何从任何hstore值中选择一行?

  25. 25

    从多行中选择一行作为默认值

  26. 26

    在熊猫的DataFrame中选择第一行的值

  27. 27

    MySQL在一行中选择多个ID值

  28. 28

    在熊猫的DataFrame中选择第一行的值

  29. 29

    Javascript仅从表的第一行中选择值

热门标签

归档