如何在一个查询中从一个表中检索记录并从另一个表中检索相关记录?

时间:2010-09-30 15:51:05

标签: sql mysql join

我有两个表,项目和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'。

6 个答案:

答案 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何时更改来进行循环。对于项目已更改的第一行和第一行,您需要执行以下操作:

  1. 创建一个新的项目对象(或用于在代码中表示它们的任何内容)
  2. 处理items表格
  3. 中的字段
  4. 检查同一行是否具有itemmeta字段的非NULL条目,如果是,则处理这些条目
  5. 循环处理itemmeta字段的后续记录,直到有新项目

答案 5 :(得分:0)

除了上面给出的具体答案之外,我还建议一本关于SQL的好的入门书。如果您刚刚学习了连接,那么您应该学习SQL的许多其他重要元素。你刚刚划过了表面。

我一直很喜欢Allen Taylor的 SQL For Dummies 。尽管是一本傻瓜书,但对于这些对SQL如此重要的概念来说,这是一个很好的介绍。