Mysql查询限制

时间:2011-10-17 10:46:44

标签: 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;
} 

我的目的是在阵列中获得10个成员的最后5个收藏夹。但正如你可以猜到这个查询包含收藏夹的10行。这意味着如果一个成员有15个收藏夹,它只会得到一个有10个收藏夹的成员而不是10个带有收藏夹的成员。

我找不到一种简单的方法来限制获取该查询中每个成员的收藏夹。我怎么能限制?

提前致谢

4 个答案:

答案 0 :(得分:1)

  1. 这不是MYSQL FETCH ARRAY LIMITATION,这是您的QUERY限制。

  2. 在这些方面尝试自己的东西:

    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工作,用户的大量信息保存为元字段,因此除非您执行此方法,否则无法选择一个大表。

祝你好运