我使用如下查询:
$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个带有收藏夹的成员。
我找不到一种简单的方法来限制获取该查询中每个成员的收藏夹。我怎么能限制?
提前致谢
答案 0 :(得分:1)
这不是MYSQL FETCH ARRAY LIMITATION,这是您的QUERY限制。
在这些方面尝试自己的东西:
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
答案 1 :(得分:0)
此查询可能会为您提供更好的方法
SELECT * FROM favorites f where f.memberid in (SELECT * FROM allmembers limit 10) ORDER BY f.date desc
虽然你应该稍后限制5个收藏夹,在php或其他什么。如果您不希望一个成员拥有10.000个收藏夹(这主要是因为您将获得10.000+ ROWS,最多只能显示10 * 5 = 50行。)
或者,您可以对每个成员进行查询,将其限制为5个结果...(这意味着总共要进行11次查询...)
答案 2 :(得分:0)
以下查询将执行您想要的操作:
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
它假定以下数据库架构:
allmembers:
id INT
name VARCHAR
favorites:
id INT
member INT
link VARCHAR
显然,您需要根据自己的数据库架构更新查询。
答案 3 :(得分:0)
你有很多方法可以做到这一点,而且他们都可以达到极限,我在这个具体案例中所做的是:
在多个左连接中将最喜欢的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
使用此方法,您还可以从收藏夹表中读取任何信息,甚至可以在另一个表上多次连接X次,以获取有关该收藏夹的更多信息。只要您设置了正确的索引,即使有数千名成员和近百万的收藏夹,这种方法也非常快。
您还可以将此策略应用于许多其他方案。例如,我们在这里使用WordPress工作,用户的大量信息保存为元字段,因此除非您执行此方法,否则无法选择一个大表。
祝你好运