从SELECT QUERY获取子列(id)以在另一个查询中使用

时间:2016-04-04 12:49:44

标签: php mysql sql

我有两个表:itemsitems_meta。在一个查询中,我想从items表中选择符合某些条件的所有项目。

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方法。

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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;

答案 2 :(得分:0)

假设您有一个表单并检索项目的ID,您可以这样做:

search keyword

如果不是:

    <?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
    }
}

希望这会有所帮助:)