2013-11-20 27 views
1

我有以下情形:使用1個查詢獲取2個相關組?

  • 1項表
  • 1成員表
  • 1頁表

每一個 「項目」 屬於 「會員」 和「頁「

$query = mysql_query("SELECT i.id, i.title, mem.realname, p.pagename 
       FROM items AS i 
       LEFT JOIN members AS mem ON (mem.ID_MEMBER = i.author) 
       LEFT JOIN pages AS p ON (p.id = i.page) 
       WHERE i.id LIKE '$item_id'"); 

這給出了我需要的基本信息:

  • ID:3,標題:音樂視頻,真實姓名:彼得·史密斯,頁面名稱有:Youtube

那麼我要爲是獲得2個獨立的 「3個相關的項目」,其中組:

  • id.author =彼得·史密斯
  • id.page =的Youtube

所以輸出會是這樣的:

  • ID:3,標題:音樂視頻,實名:彼得·史密斯,頁面名有:Youtube

  • 項從彼得·史密斯:第5項,第4項,第8項(隨機顯示)

  • 從Youtube

    項目:項目1,項目2,第9項(隨機顯示)

我需要執行2個額外的查詢來獲得這些信息?或者我可以將它包裝在所有的查詢中?

非常感謝!

UPDATE:

我加入由@valex

SELECT i.id, i.title, mem.realname, p.pagename, 
      (select CONCAT('Items from ', mem.realname,': ', 
       (select GROUP_CONCAT(Title) 
         FROM 
          (Select Title from items where author= 
            (select author from items 
               WHERE id = '$item_id' LIMIT 1) 
          ORDER BY RAND() LIMIT 3) T)    
       ) 
      ) as items_from_author, 
      (select CONCAT('Items from ',p.pagename,': ', 
       (select GROUP_CONCAT(Title) 
         FROM 
          (Select Title from items where page= 
             (select page from items 
               WHERE id = '$item_id' LIMIT 1) 

          ORDER BY RAND() LIMIT 3) T)    
       ) 
      ) as items_from_page 


      FROM items AS i 
      LEFT JOIN members AS mem ON (mem.ID_MEMBER = i.author) 
      LEFT JOIN pages AS p ON (p.id = i.page) 
      WHERE i.id LIKE '$item_id' 

但提出了一個GROUP_CONCAT收到以下錯誤:

Invalid query: Unknown column 'i.author' in 'where clause' 

任何想法?

UPDATE 2

目前使用 「第4級」 查詢由@valex建議。有沒有辦法讓它與2個級別一起工作?

SELECT i.id, i.title, mem.realname, p.pagename, 
      (select CONCAT('Items from ', mem.realname,': ', 
       (select GROUP_CONCAT(Title) 
         FROM 
          (Select Title from items where author= 
            (select author from items 
               WHERE id = '$item_id' LIMIT 1) 
          ORDER BY RAND() LIMIT 3) T)    
       ) 
      ) as items_from_author, 
      (select CONCAT('Items from ',p.pagename,': ', 
       (select GROUP_CONCAT(Title) 
         FROM 
          (Select Title from items where page= 
             (select page from items 
               WHERE id = '$item_id' LIMIT 1) 

          ORDER BY RAND() LIMIT 3) T)    
       ) 
      ) as items_from_page 


      FROM items AS i 
      LEFT JOIN members AS mem ON (mem.ID_MEMBER = i.author) 
      LEFT JOIN pages AS p ON (p.id = i.page) 
      WHERE i.id LIKE '$item_id' 

看起來像這樣可以優化某種方式。有任何想法嗎?

回答

0

您可以使用GROUP_CONCAT()函數來獲取這些列表作爲當前行中的字段。

例如:

SELECT i.id, i.title, mem.realname, p.pagename, 
       (select CONCAT('Items from ', mem.realname,': ', 
        (select GROUP_CONCAT(Title) 
          FROM 
           (Select Title from items where author=i.author 
           ORDER BY RAND() LIMIT 3) T)    
        ) 
       ) as items_from_author, 
       (select CONCAT('Items from ',p.pagename,': ', 
        (select GROUP_CONCAT(Title) 
          FROM 
           (Select Title from items where page=i.page 
           ORDER BY RAND() LIMIT 3) T)    
        ) 
       ) as items_from_page 


       FROM items AS i 
       LEFT JOIN members AS mem ON (mem.ID_MEMBER = i.author) 
       LEFT JOIN pages AS p ON (p.id = i.page) 
       WHERE i.id LIKE '$item_id' 

更新:看來MySQL不能通過兩個級別的訪問權限外查詢字段。因此,請嘗試使用以下內容:

SELECT i.id, i.title, mem.realname, p.pagename, 
       (select CONCAT('Items from ', mem.realname,': ', 
        (select GROUP_CONCAT(Title) 
          FROM 
           (Select Title from items where author= 
             (select author from items 
                WHERE id = '$item_id' LIMIT 1) 
           ORDER BY RAND() LIMIT 3) T)    
        ) 
       ) as items_from_author, 
       (select CONCAT('Items from ',p.pagename,': ', 
        (select GROUP_CONCAT(Title) 
          FROM 
           (Select Title from items where page= 
              (select page from items 
                WHERE id = '$item_id' LIMIT 1) 

           ORDER BY RAND() LIMIT 3) T)    
        ) 
       ) as items_from_page 


       FROM items AS i 
       LEFT JOIN members AS mem ON (mem.ID_MEMBER = i.author) 
       LEFT JOIN pages AS p ON (p.id = i.page) 
       WHERE i.id LIKE '$item_id' 
+0

看起來很有希望。我確實收到錯誤消息:無效查詢:'where子句'中的未知列'i.author' – James

+0

@James Query已更新。 – valex

+0

這工作....但增加了第三級最優化的解決方案?似乎有點太多了。 – James

相關問題