2010-09-30 85 views
1

我有兩個表,項目和itemmeta。 item具有item_id,它將其鏈接到itemmeta,它具有itemmeta_id,item_id,meta_key和meta_value。我這樣做,所以如果我需要添加一個特殊的標誌或值的項目,我不必不斷改變項目表。如何從一個查詢中的另一個表中檢索一個表中的記錄和相關記錄?

現在我付出了靈活性的代價。我想知道如果我可以將查詢和一些PHP組合成一個更好設計的查詢。

首先我做這樣的事情:

SELECT * FROM items; 

然後一邊通過這些循環我在PHP這樣做對每個:

$sql = "SELECT * FROM itemmeta WHERE item_id='".$item['item_id']."' "; 
$meta_result = mysql_query($sql, $conn) or die(mysql_error()); 
$item['meta'] = array(); 
while($meta=mysql_fetch_assoc($meta_result)) { 
    $item['meta'][$meta['meta_key']] = $meta['meta_value']; 
} 

是否可以使用子查詢做第二部分或類似的東西?我認爲困難的部分會保持相同的產出。例如:$ item ['meta'] ['my_key'] ='value'。我認爲它會更多$ item ['meta'] [0] [0] ='my_key'和$ item ['meta'] [0] [1] ='value'。

回答

2

你想用一個JOIN

SELECT i.*, im.* -- note you should really specify exactly which columns you want 
FROM items AS i 
JOIN itemmeta AS im 
    ON i.item_id = im.item_id 

資源:

0

SELECT * FROM項目,itemmeta其中items.id = itemmeta.item_id

0
SELECT * 
FROM items it 
INNER JOIN itemmeta im 
ON it.item_id = im.item_id 
WHERE im.meta_key = 'value' 
0
$sql = "SELECT * FROM items JOIN itemmeta ON items.id = itemmeta.item_id"; 
$rs = mysql_query($sql); 
$item['meta'] = array(); 
while($row = mysql_fetch_assoc($rs)) { 
    $item['meta'][$row['meta_key']] = $row['meta_value'] 
} 

應該工作

0

,你就能把所有的合併成一個查詢,但它確實複雜的客戶端代碼。如果您使用下面的查詢:

SELECT * FROM items 
LEFT JOIN itemmeta USING (item_id) 

然後客戶端代碼必須通過檢查時item_id變化做循環。對於第一行,行,其中的項目發生了變化,你需要做到以下幾點:

  1. 創建一個新的項目對象(或任何你正在使用,以表示它們在你的代碼)
  2. 過程從地裏在items
  3. 檢查同一行先後爲itemmeta域非空(NULL),並通過隨後的記錄處理itemmeta場處理這些如果是
  4. 循環,直到有一個新項目
0

除了上面給出的特定答案之外,我還提出了一本關於SQL的入門書籍。如果你現在剛剛學習了連接,還有很多你應該學習的其他重要的SQL元素。你剛剛刮過了表面。

我一直很喜歡Allen Taylor的SQL For Dummies。儘管是一本傻瓜書,但對於這些對於SQL來說非常重要的概念,你會發現它們的介紹非常好。