2016-04-04 49 views
1

使用我有兩個表:itemsitems_meta。在一個查詢中,我想從項目表中選擇符合某些條件的所有項目。獲取SELECT查詢子欄目(ID)到另一個查詢

SELECT id,name,price description FROM items 
WHERE {some conditions are true}; 

我想也選擇在items_meta匹配第一個查詢的項目的id所有行。這將用於與第一個查詢不直接相關的另一個目的。

SELECT meta_name, meta_value,COUNT(*) FROM items_meta 
WHERE item_id IN ({the ids from the previous query}) 
GROUP BY meta_name, meta_value; 

我目前的實現是通過循環使用PHP的第一批成果,打造第二個查詢中使用的id列表。

foreach ($items as $item){ 
    $items_id[] = $item["id"]; 
} 

$IDs = implode(",", $items_id); 

我認爲應該有一個比這更好的sql方法。

回答

2

使用joinin

SELECT im.meta_name, im.meta_value, COUNT(*) 
FROM items i JOIN 
    items_meta im 
    ON im.item_id = i.id 
WHERE {some conditions are true} 
GROUP BY im.meta_name, im.meta_value; 
+0

這個解決方案是我最初實際上想到的。唯一的挑戰是第一個查詢實際上是一個複雜查詢的簡化形式,該查詢連接多個表以生成結果。在第二個查詢中重複這些連接實際上使得它更加複雜且處理器密集。 – elSama

+0

我也想過使用第一個查詢創建一個臨時表,然後使用你的方法。我駁回這個想法的原因是因爲它引入了額外的複雜性。我不得不將數據插入到臨時表中,然後再次選擇所有結果作爲我的第一個輸出。如果有辦法插入數據並返回,我會很高興 – elSama

1

試試這個:

SELECT id, 
    name, 
    price, 
    description, 
    meta_name, 
    meta_value, 
    COUNT(*) 
FROM items 
INNER JOIN items_meta ON items_meta.item_id = items.id 
WHERE {SOME conditions ARE TRUE} 
GROUP BY meta_name, 
    meta_value; 
+0

謝謝你的迴應。您的解決方案有效,但不是我想要的方式。正如我在我的問題中所說的,實際上我需要兩個不同的結果來達到兩個不同的目的但您的解決方案只提供一個。結果將作爲兩個不同的變量傳遞給模板 – elSama

0

假設你有一個表格和檢索項的ID,你可以這樣做:

<?php 

// $db being the PDO connection 

$stmt_items = $db->query("SELECT id,name,price description FROM items WHERE {some conditions are true};"); 
$stmt_items_meta = $db->prepare("SELECT meta_name, meta_value,COUNT(*) FROM items_meta WHERE item_id = ".$_POST['id']." GROUP BY meta_name, meta_value;"); 
$stmt_count_items_meta = $db->query("SELECT COUNT(*) FROM items_meta WHERE item_id = ".$_POST['id'].";"); 

while ($item = $stmt_items->fetch()) { 

    // do things with your first query 

    if ($stmt_count_items_meta->fetchColumn() > 0){ 
     $stmt_items_meta->execute(); 
     // do things with your second query 
    } 
} 

如果不是:

<?php 

$stmt_items = $db->query("SELECT id,name,price description FROM items WHERE {some conditions are true};"); 


while ($item = $stmt_items->fetch()) { 
    $stmt_items_meta = $db->prepare("SELECT meta_name, meta_value,COUNT(*) FROM items_meta WHERE item_id = ".$item['id']." GROUP BY meta_name, meta_value;"); 
    $stmt_count_items_meta = $db->query("SELECT COUNT(*) FROM items_meta WHERE item_id = ".$item['id'].";"); 
    // do things with your first query 

    if ($stmt_count_items_meta->fetchColumn() > 0){ 
     $stmt_items_meta->execute(); 
     // do things with your second query 
    } 
} 

希望這會有所幫助:)