我有两个表:items
和items_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方法。
答案 0 :(得分:2)
使用join
或in
:
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
}
}
希望这会有所帮助:)