2010-09-30 153 views
1

我有两个表,项目和itemmeta。 item具有item_id,它将其链接到itemmeta,它具有itemmeta_id,item_id,meta_key和meta_value。我这样做,所以如果我需要添加一个特殊的标志或值的项目,我不必不断改变项目表。如何从一个查询中的另一个表中检索一个表中的记录和相关记录?

现在我付出了灵活性的代价。我想知道如果我可以将查询和一些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'。

回答

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 

资源:

0

SELECT * FROM项目,itemmeta其中items.id = itemmeta.item_id

0
SELECT * 
FROM items it 
INNER JOIN itemmeta im 
ON it.item_id = im.item_id 
WHERE im.meta_key = 'value' 
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'] 
} 

应该工作

0

,你就能把所有的合并成一个查询,但它确实复杂的客户端代码。如果您使用下面的查询:

SELECT * FROM items 
LEFT JOIN itemmeta USING (item_id) 

然后客户端代码必须通过检查时item_id变化做循环。对于第一行,行,其中的项目发生了变化,你需要做到以下几点:

  1. 创建一个新的项目对象(或任何你正在使用,以表示它们在你的代码)
  2. 过程从地里在items
  3. 检查同一行先后为itemmeta域非空(NULL),并通过随后的记录处理itemmeta场处理这些如果是
  4. 循环,直到有一个新项目
0

除了上面给出的特定答案之外,我还提出了一本关于SQL的入门书籍。如果你现在刚刚学习了连接,还有很多你应该学习的其他重要的SQL元素。你刚刚刮过了表面。

我一直很喜欢Allen Taylor的SQL For Dummies。尽管是一本傻瓜书,但对于这些对于SQL来说非常重要的概念,你会发现它们的介绍非常好。

相关问题