加入两个mysql表

时间:2010-09-29 18:44:11

标签: php mysql join

我有两个数据库 - 一个用于文章,另一个用于文章的元信息(如作者,日期,类别和atc。)。我在元表中有以下列:ID,文章ID,元类型和元值。我想知道如何通过一个mysql查询加入这两个表来获取文章和元信息。文章ID在元表中不是唯一的,这就是为什么我无法弄清楚如何访问特定元类型和文章的值...

这是我试图使用的mysql:

SELECT products.*, product_meta.meta_value
FROM products
LEFT JOIN product_meta ON products.ID = product_meta.product_id

但这个查询似乎不是我需要的。例如,文章表中有两个记录,元表中有十个记录,此代码显示十个结果而不是两个:

$products = mysql_query("SELECT products.*, product_meta.meta_value
                         FROM products
                         LEFT JOIN product_meta ON products.ID = product_meta.product_id") or die(mysql_error());

while ($product = mysql_fetch_assoc($products)) {
    echo $product["title"];
}

有人可以帮忙吗?

6 个答案:

答案 0 :(得分:0)

只需将LEFT JOIN更改为RIGHT JOIN即可获得所需的结果。或翻转查询:SELECT ... FROM product_meta LEFT JOIN product .. etc.

答案 1 :(得分:0)

“我在元表中有以下列:ID,文章ID,元类型和元值。”

你确定这是一个合适的设计吗?如果一篇文章最多只能有一个作者,日期等,那么也许这些应该是“文章”表中的列。 (另一方面,很有可能设想一篇文章由几个人共同撰写 - 但是你可能想要一个“article_authors”表专门列出文章的作者,而不是这个Entity-Attribute-Value系统你我要走了。)

如果您已经开始使用此设计,那么您可以:

1)获取一行中每篇文章的元数据,连接成一个字段。

2)只需查找文章,并为每篇文章运行查询以从“meta”表中获取元数据:

$products = mysql_query("SELECT products.*, product_meta.meta_value
                         FROM products
                         LEFT JOIN product_meta ON products.ID = product_meta.product_id") or die(mysql_error());

while ($product = mysql_fetch_assoc($products)) {
    $products_meta = mysql_query( /* something else */ );
    echo $product["title"];
}

3)运行您已有的查询,但检查每一行是否是新文章,或者只检查上一篇文章的更多元数据:

$products = mysql_query("SELECT products.*, product_meta.meta_value
                         FROM products
                         LEFT JOIN product_meta ON products.ID = product_meta.product_id") or die(mysql_error());

$old_product_id = -1;
while ($product = mysql_fetch_assoc($products)) {
    if ( $product['product_id'] != $old_product_id ) {
        $old_product_id = $product['product_id'];
        echo $product["title"];
    }
}

答案 2 :(得分:0)

尝试以下sql语句:

SELECT products.*, product_meta.meta_value
FROM products LEFT OUTER JOIN product_meta 
ON products.ID = product_meta.product_id
WHERE product_meta.product_id NOT IS NULL

答案 3 :(得分:0)

查看Jeff's guide to SQL joins以获取一些帮助,了解哪种加入可能最适合您的目的。

答案 4 :(得分:0)

使用子查询:

SELECT products.*, (SELECT product_meta.meta_value FROM product_meta WHERE 
  products.ID = product_meta.product_id AND meta_type = "author") AS meta_author 
FROM products

您可以添加更多子查询,以便为结果集添加更多元数据。

但请注意,子查询不能提供最佳性能。如果mysql性能很重要,您可以考虑使用当前的join语句并在php中转置数据。

答案 5 :(得分:0)

我还要求数据库设计作为入门者 - 我觉得某些“元类型”(作者,类别)应该是单独的表,而其他(日期)应该存在于文章表中。数据库规范化是关键,MySQL网站上有一个很好的介绍:http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html

在连接表格时,您可能更喜欢使用以下内容:

SELECT 
  products.*, product_meta.meta_value 
FROM 
  products, product_meta 
WHERE 
  products.ID = product_meta.product_id 
  AND product_meta.meta_type = 'author';

即。列出from子句中的表而不是使用连接

然后,为了简单地返回相关元行,可能需要做的就是在现有查询中添加'WHERE'子句:

... WHERE product_meta.meta_type = 'author';