簡體   English   中英

PHP,MySql連接表,每個類別的限制記錄

[英]Php, MySql join tables, limit records per category

我有兩個表:

物品

ID      Name                Model_ID
---------------------------------
1       2010 Audi L1        1
2       2014 BMW X2         2
3       2015 Acura L3       3
4       2016 BMW X5         2
5       2012 BMW X3         2
6       2013 BMW X4         2
7       2015 Acura L1       3
8       2011 Acura L2       3
9       2011 Audi L5        1
10      2012 Audi L6        1

品牌品牌

Model_ID        Title
---------------------
1               Audi
2               BMW
3               Acura

和以下查詢:

  SELECT 
    b.name,
    i.title,
  FROM
    items AS i 
    INNER JOIN brands AS b 
      ON b.Model_ID = i.Model_ID 
  WHERE i.status = 1
  ORDER BY i.created DESC;

上面產生了工作數組:

Array
(
    [0] => stdClass Object
        (
            [name] => 2010 Audi L1
            [title] => Audi
        )

    [1] => stdClass Object
        (
            [name] => 2014 MBW X5
            [title] => BMW

        )

        ...
)

比我使用自定義函數遍歷數組並最終得到

Array
(
    [Acura] => Array
        (
            [0] => stdClass Object
                (
                    [name] => 2015 Acura L1
                    [title] => Acura
                )

            ...
        )

    [BWM] => Array
        (
            [0] => stdClass Object
                (
                    [name] => 2016 BMW X5
                    [title] => BWM
                )

            ...
        )
    [Audi] => Array
        (
            [0] => stdClass Object
                (
                    [name] => 2010 Audi L1
                    [title] => Audi
                )
            ...
        )    
)

現在,我可以使用foreach循環並限制每個品牌顯示x個項目,但是這個想法是在數據庫中完成,因此,除了提取所有記錄,我希望每個品牌可以限制5個項目。

注意:我未列出用於對記錄進行排序的其余表字段,例如創建的。

  1. 獲得品牌:

$ q ='從品牌ORDER BY標題ASC中選擇Model_ID AS ID';
$ r = mysql_query($ q);
$ model_ids = array();
while($ brand = mysql_fetch_assoc($ r)){$ model_ids [] = $ brand ['id']; }

  1. 然后使用從第一步或其他位置(例如:從搜索表單中)收集到的Model_ID-進行如下生成選擇查詢:

 $q = array(); foreach($mode_ids AS $model_id) { $q[] = '(SELECT b.name, i.title FROM items AS i INNER JOIN brands AS b ON b.Model_ID = i.Model_ID WHERE b.Model_ID = '.(int)$model_id.' AND i.status = 1 ORDER BY i.created DESC LIMIT 5)'; } if(!empty($q)) { $q = implode(' UNION ALL ', $q); $r = mysql_query($q); while($record = mysql_fetch_object($r)) { var_dump($record); } } 

結果,我們將獲得結果查詢的記錄:

(從項目中選擇“ b.name”,“ i.title”作為“ i i.INNER JOIN”品牌作為“ b ON”。b.Model_ID= i.Model_ID,b.Model_ID = 1並且i.status = 1由i。創建的DESC LIMIT 5)

全聯盟

(從項目中選擇b.name,i.title作為AS i INNER JOIN品牌作為b.b.Model_ID = i.Model_ID WHERE b.Model_ID = 2 AND i.status = 1按i。創建的DESC LIMIT 5排序)

全聯盟

(從項目中選擇“ b.name”,“ i.title”作為“ i i.INNER JOIN”品牌作為“ b ON”。b.Model_ID= i.Model_ID WHERE b.Model_ID = 3並且i.status = 1由i。創建的DESC LIMIT 5)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM