Sql 如何在一个查询中检索一个表中的记录和另一个表中的相关记录?

Sql 如何在一个查询中检索一个表中的记录和另一个表中的相关记录?,sql,mysql,join,Sql,Mysql,Join,我有两张桌子,items和itemmeta。items具有item_id,该id将其链接到itemmeta,itemmeta id具有itemmeta_id、item_id、meta_键和meta_值。如果我需要为一个项目添加一个特殊的标志或值,我就这样做了,而不必一直更改items表 现在我为灵活性付出了代价。我想知道我是否可以将一个查询和一些php组合成一个设计更好的查询 首先,我会这样做: SELECT * FROM items; 然后,在循环浏览这些内容时,我在php中对每一个都这样做

我有两张桌子,items和itemmeta。items具有item_id,该id将其链接到itemmeta,itemmeta id具有itemmeta_id、item_id、meta_键和meta_值。如果我需要为一个项目添加一个特殊的标志或值,我就这样做了,而不必一直更改items表

现在我为灵活性付出了代价。我想知道我是否可以将一个查询和一些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']='value'。我假设更多的是$item['meta'][0][0]='my_key'和$item['meta'][0][1]='value'

选择*from items,itemmeta,其中items.id=itemmeta.item\u id


您想使用
连接

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
资源:

  • 在MySQL手册中

应该可以工作

您可以将所有内容合并到一个查询中,但这会使客户端代码复杂化。如果使用以下查询:

SELECT * FROM items
LEFT JOIN itemmeta USING (item_id)
然后,客户端代码必须在
item\u id
更改时进行循环检查。对于第一行和项目已更改的行,您需要执行以下操作:

  • 创建一个新的item对象(或在代码中表示它们的任何对象)
  • 处理
    表中的字段
  • 检查同一行的
    itemmeta
    字段是否有非空条目,如果有,则进行处理
  • 循环处理后续记录
    itemmeta
    字段,直到出现新项

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

    我一直喜欢艾伦·泰勒的傻瓜SQL。尽管这是一本傻瓜书,但它是对这些概念的一个很好的介绍,这些概念对SQL非常重要

    $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']
    }
    
    SELECT * FROM items
    LEFT JOIN itemmeta USING (item_id)