2011-07-12 133 views
0

我試圖製作一個功能有點像數字貼紙專輯的頁面。我的SQL知識不是很好,所以我需要一些幫助來完成我迄今爲止的工作。簡單的數字貼紙專輯的mysql查詢和php腳本

我想顯示所有可用貼紙的列表,但也顯示用戶是否有貼紙。所以這個想法是顯示空盒子(物品)列表,然後在用戶擁有貼紙的情況下在盒子內顯示圖像。

我有兩個相關的表稱爲「項目」和「庫存」。商品包含所有可用的貼紙,而廣告資源包含用戶擁有的貼紙。

這裏是可用列:

CREATE TABLE items (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
    name VARCHAR(255) 
) Engine=InnoDB; 

CREATE TABLE inventory (
    userid INT UNSIGNED, 
    itemid INT UNSIGNED, 
    -- FOREIGN KEY (userid) REFERENCES users (id), 
    FOREIGN KEY (itemid) REFERENCES items (id), 
    UNIQUE (itemid, userid) 
) Engine=InnoDB; 

我願意到去這樣做使用PHP和MySQL的最佳方法的建議,但我想我需要的是一個查詢返回一個列表的所有項目名稱,然後是另一列來標記用戶是否擁有該項目。然後我可以循環遍歷php中的項目,然後使用基於第二列的條件來顯示貼紙是否存在。

到目前爲止,我已經得到儘可能下面的查詢,但它只需要顯示當前用戶的項目。堅持'where'子句不起作用,因爲它只顯示庫存項目而不顯示NULL項目(也就是說,它不包含所有項目)。

SELECT items.name, inventory.userid 
    FROM items 
    LEFT JOIN inventory ON items.id = inventory.itemid 

SELECT items.name, inventory.userid 
    FROM items 
    LEFT JOIN inventory ON items.id = inventory.itemid 
    WHERE inventory.userid = '$userid' 

回答

1

嘗試將用戶ID測試移動到JOIN條件:

SELECT items.name, inventory.userid 
    FROM items 
    LEFT JOIN inventory 
     ON items.id = inventory.itemid AND inventory.userid=? 

這樣,當連接條件失敗(如當產品中的其他用戶的庫存),項目本身仍包含在結果,但具有空的用戶標識。它也可以在表格清單上使用適當定義的索引。

+0

正是我需要的,謝謝。現在看起來很明顯:) – spengos

0

糾正我,如果我誤解了,我會相應地更新。

  • 您正在輸出一個包含所有項目的表格。
  • 每個列出的項目 都會有一個空的「方框」,如果當前用戶有這個 項目,則填充該方框。

要做到這一點,您只需要2個查詢 - 一個取得所有物品,另一個取得當前用戶庫存的物品ID。

// Get all current user's items 
$qUsersItems = "SELECT items.id AS itemID FROM items, inventory WHERE items.id = inventory.itemid AND inventory.userid = " . $givenUserID . 
$rUsersItems = mysql_query($qUserItems); 

// Store the user's items' IDs into an array 
while (list($itemID) = mysql_fetch_assoc($rUsersItems)) 
    $usersItems[] = $itemID; 


// Get all items 
$qAllItems = "SELECT id, name FROM items"; 
$rAllItems = mysql_query($qAllitems); 

// ... (To wherever you are outputting your items list) 

while ($item = mysql_fetch_assoc($rAllItems)) { 

    if (in_array($item['id'], $usersItems)) // Since this ID is in the users list of items (ids) 
     $fillBox = "HTML to fill box"; 
    else 
     $fillBox = ""; 

    /* Your "per item" HTML here, for example (assuming you have outputted table tags before and after the while loop */   
    echo<<<HTML 

<tr> 
    <td>{$item['name']</td> 
    <td>{$fillBox}</td> <!-- This would be your empty box /--> 
</tr> 

HTML; 

注:此代碼是未經測試,並未完成原因是顯而易見的。在我寫完這些之後,我意識到爲什麼人們要求先表明你先做了什麼。