Php Mysql查询限制
我使用如下查询:Php Mysql查询限制,php,mysql,sql,arrays,Php,Mysql,Sql,Arrays,我使用如下查询: $querym = mysql_query("SELECT * FROM allmembers a LEFT JOIN favorites f ON (f.memberid=a.memberid) order by f.date desc LIMIT 10"); while($row = mysql_fetch_array($querym,MYSQL_ASSOC)) { $dataArray[$row['memberid']][$row['favoriteid']]=$row
$querym = mysql_query("SELECT * FROM allmembers a LEFT JOIN favorites f ON (f.memberid=a.memberid) order by f.date desc LIMIT 10");
while($row = mysql_fetch_array($querym,MYSQL_ASSOC)) {
$dataArray[$row['memberid']][$row['favoriteid']]=$row;
}
我的目标是在一个数组中获得10个成员及其最后5个收藏夹。但正如您可以猜到的,这个查询包含了10行收藏夹。这意味着,如果一个成员有15个收藏夹,那么只有一个成员有10个收藏夹,而不是10个成员有他的收藏夹
我找不到一个简单的方法来限制查询中每个成员的收藏夹。我如何限制
提前谢谢
SELECT memberid,group_concat(favorites_field) FROM allmembers a LEFT JOIN favorites f ON (f.memberid=a.memberid) group by a.memberid order by f.date desc LIMIT 10
此查询可能会为您提供更好的方法
SELECT * FROM favorites f where f.memberid in (SELECT * FROM allmembers limit 10) ORDER BY f.date desc
尽管以后应该限制5个收藏夹,用php或其他语言。如果您不希望一个成员有10.000个收藏夹,这可能会起作用(基本上是因为您将获得10.000多行,最多显示10*5=50行)
或者,您可以为每个成员执行查询,将其限制为5个结果。。。(这意味着总共要执行11个查询…以下查询将执行您想要的操作:
SELECT
a.id as member_id,
a.name,
f1.id as favorite_id,
f1.link
FROM
allmembers a
JOIN favorites f1 ON f1.member = a.id
LEFT JOIN favorites f2 ON f2.member = f1.member AND f2.date < f1.date
GROUP BY
a.id, a.name, f1.id, f1.link
HAVING
COUNT(f2.id) < 10
ORDER BY
a.name, f1.id
显然,您需要根据自己的数据库模式更新查询。您有很多方法可以做到这一点,而且它们的性能都可以达到一定的限度,在这种特定情况下,我会这样做: 在多个左连接中获取最喜爱的id作为一个单独的字段,然后您可以轻松地为每个字段(…)行数组并检索id。查询如下所示。根据自己的使用情况进行调整:
SELECT
a.*,
f1.favoriteid as f1id,
f2.favoriteid as f2id,
f3.favoriteid as f3id,
f4.favoriteid as f4id,
f5.favoriteid as f5id
FROM allmembers a
LEFT JOIN favorites f1 ON (f.memberid=a.memberid)
LEFT JOIN favorites f2 ON (f.memberid=a.memberid) AND f1.favoriteid <> f2.favoriteid
LEFT JOIN favorites f3 ON (f.memberid=a.memberid) AND f1.favoriteid <> f3.favoriteid AND f2.favoriteid <> f3.favoriteid
LEFT JOIN favorites f4 ON (f.memberid=a.memberid) AND f1.favoriteid <> f4.favoriteid AND f2.favoriteid <> f4.favoriteid AND f3.favoriteid <> f4.favoriteid
LEFT JOIN favorites f5 ON (f.memberid=a.memberid) AND f1.favoriteid <> f5.favoriteid AND f2.favoriteid <> f5.favoriteid AND f3.favoriteid <> f5.favoriteid AND f4.favoriteid <> f5.favoriteid
order by f.date desc LIMIT 10
选择
a、 *,
f1.favoriteid作为f1id,
f2.favoriteid作为f2id,
f3.favoriteid作为f3id,
f4.favoriteid作为f4id,
f5.favoriteid作为f5id
所有成员a
左连接收藏夹f1打开(f.memberid=a.memberid)
左键连接收藏夹f2 ON(f.memberid=a.memberid)和f1.favoriteid f2.favoriteid
左键连接收藏夹f3 ON(f.memberid=a.memberid)和f1.favoriteid f3.favoriteid和f2.favoriteid f3.favoriteid
左键连接收藏夹f4 ON(f.memberid=a.memberid)和f1.favoriteid f4.favoriteid以及f2.favoriteid f4.favoriteid和f3.favoriteid f4.favoriteid
左键连接收藏夹f5开(f.memberid=a.memberid)和f1.favoriteid f5.favoriteid和f2.favoriteid f5.favoriteid和f3.favoriteid f5.favoriteid和f4.favoriteid f5.favoriteid
按f.date desc LIMIT 10订购
使用此方法,您还可以从“收藏夹”表中读取任何信息,甚至可以多次在另一个表上左键联接,以获取有关该收藏夹的更多信息。只要设置了正确的索引,即使有数千个成员和近百万个收藏夹,这种方法也会非常快
您还可以将此策略应用于许多其他场景。例如,我们在工作中使用WordPress,用户的许多信息都作为元字段保存,因此,除非执行此方法,否则选择一个大表是不可能的
祝你好运
SELECT
a.*,
f1.favoriteid as f1id,
f2.favoriteid as f2id,
f3.favoriteid as f3id,
f4.favoriteid as f4id,
f5.favoriteid as f5id
FROM allmembers a
LEFT JOIN favorites f1 ON (f.memberid=a.memberid)
LEFT JOIN favorites f2 ON (f.memberid=a.memberid) AND f1.favoriteid <> f2.favoriteid
LEFT JOIN favorites f3 ON (f.memberid=a.memberid) AND f1.favoriteid <> f3.favoriteid AND f2.favoriteid <> f3.favoriteid
LEFT JOIN favorites f4 ON (f.memberid=a.memberid) AND f1.favoriteid <> f4.favoriteid AND f2.favoriteid <> f4.favoriteid AND f3.favoriteid <> f4.favoriteid
LEFT JOIN favorites f5 ON (f.memberid=a.memberid) AND f1.favoriteid <> f5.favoriteid AND f2.favoriteid <> f5.favoriteid AND f3.favoriteid <> f5.favoriteid AND f4.favoriteid <> f5.favoriteid
order by f.date desc LIMIT 10