抓取随机行,同时保持其他表的顺序

Posted

技术标签:

【中文标题】抓取随机行,同时保持其他表的顺序【英文标题】:Grabbing random rows while maintaining order across other tables 【发布时间】:2011-11-09 19:33:04 【问题描述】:

我试图从一个表中随机抓取大约 20 个随机行,然后使用 INNER JOIN 命令,根据一个通用 ID 从不同的表中向这些行添加大约 7 列附加数据。

该数据库包含 2 个表,第一个(列表)由 id(有孔)索引,第二个(列表元素)对于第一个表中的每个 id 有 7 个 field_name/field_value 对。我对其中 5 个感兴趣。

我不知道该怎么做。可以在数据库中完成,还是应该以编程方式在多个查询中完成?

SELECT listings.id, listings.title, listings.featured, listingselements.field_name, listingselements.field_value 
FROM listings
INNER JOIN listingselements 
ON listings.id = listingselements.id
WHERE RAND()<(SELECT ((20/COUNT(*))*10) FROM listings)
AND (listingselements.field_name = "price"
OR listingselements.field_name = "bathrooms"
OR listingselements.field_name = "bedrooms"
OR listingselements.field_name = "sq_meter"
OR listingselements.field_name = "city")
ORDER BY RAND();

WHERE/ORDER BY RAND() 效果很好,但是查询在转到下一项之前不会抓取 INNER JOIN 列。

【问题讨论】:

listingsdbelements 有轻微错字? on 子句显示列表元素(无 db) 是的,刚刚更正了,我更改了问题的变量名,因为它们太长了。 【参考方案1】:

尝试将随机的 20% 放入 from 子句中的内部选择

select inner_listings.id, inner_listings.title, inner_listings.featured,
  listingselements.field_name, listingsdbelements.field_value
from 
  (SELECT listings.id, listings.title, listings.featured
  FROM listings
  WHERE RAND()<(SELECT ((20/COUNT(*))*10) FROM listings)
  ORDER BY RAND()) inner_listings 
inner join listingselements ON inner_listings.id = listingselements.id
where (listingselements.field_name = "price"
  OR listingselements.field_name = "bathrooms"
  OR listingselements.field_name = "bedrooms"
  OR listingselements.field_name = "sq_meter"
  OR listingselements.field_name = "city")

【讨论】:

以上是关于抓取随机行,同时保持其他表的顺序的主要内容,如果未能解决你的问题,请参考以下文章

Clojure 懒惰地从文件中读取随机行

SQL - 如何选择随机行,直到该行的总值为某个数字?

R:使用 fread 或等价物从文件中读取随机行?

在PostgreSQL中选择N个匹配条件的随机行

防止随机行和重复的重复

选择随机行PostgreSQL的最佳方法