2016-04-04 50 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 
    } 
} 

希望这会有所帮助:)