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个成员有他的收藏夹

我找不到一个简单的方法来限制查询中每个成员的收藏夹。我如何限制

提前谢谢

  • 这不是MYSQL获取数组限制,这是您的查询限制

  • 在以下几行中尝试您自己的内容:

    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