2010-09-29 5 views
1

У меня есть две базы данных - одна для статей, а другая для метаинформации статей (например, автор, дата, категория и atc.). У меня есть следующие столбцы в мета-таблице: ID, идентификатор статьи, мета-тип и мета-значение. Интересно, как я могу присоединиться к этим двум таблицам, чтобы получить как статью, так и метаинформацию - с одним запросом mysql. Идентификатор статьи не является уникальным в мета-таблице, поэтому я не могу понять, как получить доступ к конкретному мета-типу и по значению для статьи ...Присоединиться к двум таблицам mysql

Вот 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

возможно дубликат [Объединить две таблицы MySQL] (http://stackoverflow.com/questions/3824142/join-two-mysql-tables) – RedFilter

ответ

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 
0

просто измените LEFT JOIN на номер RIGHT JOIN, и вы должны получить нужные результаты. или флиртовать запрос: SELECT ... FROM product_meta LEFT JOIN product .. etc.

+0

Не верно. В этом случае он будет извлекать строки только из мета-таблицы, несмотря на то, что в таблице статей есть соответствующая запись или нет ... –

0

«У меня есть следующие столбцы в мета-таблице: ID, идентификатор товара, мета-тип и мета-значение».

Вы уверены, что это подходящий дизайн? Если в статье может быть только один автор, дата и т. Д., Возможно, это должны быть столбцы в таблице «статья». (С другой стороны, вполне возможно предусмотреть статью, соавторную несколькими людьми, - но тогда вы, вероятно, захотите, чтобы таблица «article_authors» специально указывала авторов статей, а не эту систему Entity-Attribute-Value, которую вы есть происходит)

Если вы решительно настроены на использование этой конструкции, то вы можете:.

1) извлекает метаданные для каждой статьи в одной строке, объединяются в одно поле.

2) Только посмотрите на статьи, и для каждой статьи выполнить запрос, чтобы получить метаданные из «мета» таблицы:

$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"]; 
    } 
} 
0

Откажитесь от Jeff's guide to SQL joins, чтобы выяснить, какое соединение может быть лучше для ваших целей.

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 

Вы можете добавить больше подзапросов, чтобы добавить больше meta_types носком ResultSet.

Но будьте осторожны, что подзапросы не обеспечивают оптимальную производительность. Если важна производительность mysql, вы можете использовать текущую инструкцию объединения и перенести данные в php.

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'; 
Смежные вопросы