我有两个数据库 - 一个用于文章,另一个用于文章的元信息(如作者,日期,类别和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"];
}
有人可以帮忙吗?
答案 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';