我目前正在这样做是为了从表中获取一些数据:
SELECT DISTINCT(CategoryID),Distance FROM glinks_DistancesForTowns WHERE LinkID = $linkID ORDER BY Distance LIMIT 20
我正在为每个链接id进行迭代(奇数为50k)。我正在使用以下方法在Perl中处理它们:
my @cats;
while (my ($catid,$distance) = $sth->fetchrow) {
push @cats, $cat;
}
我正在尝试查看是否有更好的方法可以在MySQL子查询中进行,而不是进行50k较小的查询(即每个链接一个)
该表的基本结构为:
glinks_Links
ID
glinks_DistancesForTowns
LinkID
CategoryID
Distance
我敢肯定必须有一个简单的方法来做到这一点-但我只是没有看到它。
根据要求-这是表结构的转储。它实际上比这更复杂,但是其他字段仅包含值,因此我将那些位取出来以更清晰地查看该结构:
CREATE TABLE `glinks_DistancesForTowns` (
`LinkID` int(11) DEFAULT NULL,
`CategoryID` int(11) DEFAULT NULL,
`Distance` float DEFAULT NULL,
`isPaid` int(11) DEFAULT NULL,
KEY `LinkID` (`LinkID`),
KEY `CategoryID` (`CategoryID`,`isPaid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
CREATE TABLE `glinks_Links` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Title` varchar(100) NOT NULL DEFAULT '',
`URL` varchar(255) NOT NULL DEFAULT 'http://',
PRIMARY KEY (`ID`),
KEY `booking_hotel_id_fk` (`booking_hotel_id_fk`)
) ENGINE=MyISAM AUTO_INCREMENT=617547 DEFAULT CHARSET=latin1
我希望这样的事情:
SELECT glinks_Links.ID FROM glinks_Links as links, glinks_DistancesForTowns as distance (
SELECT DISTINCT(CategoryID),Distance FROM distance WHERE distance.LinkID = links.ID ORDER BY Distance LIMIT 20
)
但这显然行不通;)
听起来您想要每个链接的距离排名前20位的城镇,对吗?
MySQL 8.0支持窗口函数,这将是编写查询的方式:
WITH cte AS (
SELECT l.ID, ROW_NUMBER() OVER(PARTITION BY l.ID ORDER BY d.Distance) AS rownum
FROM glinks_Links as l
JOIN glinks_DistancesForTowns AS d ON d.LinkID = l.ID
) SELECT ID FROM cte WHERE rownum <= 20;
8.0之前的版本不支持SQL的这些功能,因此必须使用用户定义的变量或自联接来发挥创意。例如,请参阅我对如何选择每个类别中最新的四个项目的回答?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句