我有两个表,项目和itemmeta。 items具有item_id,它将itemmeta链接到具有itemmeta_id,item_id,meta_key和meta_value的itemmeta。我做了这个,所以如果我需要为一个项目添加一个特殊的标志或值,我不必继续更改项目表。
现在我付出了灵活的代价。我想知道我是否可以将查询和一些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'] ='价值'。我假设它会更多$ item ['meta'] [0] [0] ='my_key'和$ item ['meta'] [0] [1] ='value'。
答案 0 :(得分: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
资源:
答案 1 :(得分:0)
select * from items,itemmeta where items.id = itemmeta.item_id
答案 2 :(得分:0)
SELECT *
FROM items it
INNER JOIN itemmeta im
ON it.item_id = im.item_id
WHERE im.meta_key = 'value'
答案 3 :(得分: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']
}
应该有效
答案 4 :(得分:0)
您可以将它们全部合并到一个查询中,但它会使您的客户端代码变得复杂。如果您使用以下查询:
SELECT * FROM items
LEFT JOIN itemmeta USING (item_id)
然后客户端代码必须通过检查item_id
何时更改来进行循环。对于项目已更改的第一行和第一行,您需要执行以下操作:
items
表格itemmeta
字段的非NULL条目,如果是,则处理这些条目itemmeta
字段的后续记录,直到有新项目答案 5 :(得分:0)
除了上面给出的具体答案之外,我还建议一本关于SQL的好的入门书。如果您刚刚学习了连接,那么您应该学习SQL的许多其他重要元素。你刚刚划过了表面。
我一直很喜欢Allen Taylor的 SQL For Dummies 。尽管是一本傻瓜书,但对于这些对SQL如此重要的概念来说,这是一个很好的介绍。