在MySQL中查询时连接表

时间:2015-12-22 09:36:56

标签: php mysql sql wordpress

我有3个表:tco_articlestco_module_eostexttco_articles_modules。我的tco_articles具有唯一的id密钥。每篇文章一篇。我的tco_module_eostext具有属于每篇文章的唯一instance_id。 我的tco_articles_modules包含所有article_id个,但在其他表格中使用的instance_id为9倍。

enter image description here

所以我可以article_id instance_id tco_module_eostextglobal $wpdb; $posts = array(); $ids = $wpdb->get_results('SELECT DISTINCT instance_id, article_id FROM tco_articles_modules', ARRAY_A); 中的查询将返回空。

我想创建一个查询,为正确的文章返回正确的正文。

到目前为止,我有:

Array
(
    [0] => Array
        (
            [instance_id] => 928615
            [article_id] => 129396
        )

    [1] => Array
        (
            [instance_id] => 928616
            [article_id] => 129396
        )

    [2] => Array
        (
            [instance_id] => 928617
            [article_id] => 129396
        )

    [3] => Array
        (
            [instance_id] => 928618
            [article_id] => 129396
        )

这将返回包含所有实例和ID的数组,如:

article_id

您可以看到instance_id是相同的$wpdb->get_results('SELECT body FROM tco_module_eostext WHERE instance_id=928617 ', ARRAY_A); 。当你把

$wpdb->get_results('SELECT body FROM tco_module_eostext WHERE instance_id=928618 ', ARRAY_A);

你可能会变空,但

foreach ($ids as $key => $value) {
    $instance_ID = $value['instance_id'];
    $article_ID = $value['article_id'];

    $article_out = $wpdb->get_results('SELECT * FROM tco_articles WHERE id='.$article_ID.' ', ARRAY_A);
    $posts[$article_ID] = $article_out[0];

}

你可以有一些正文。

这是我的问题。我需要仔细检查所有这些并过滤掉非空的并为它们分配正确的文章。我设法输出文章

Array
(
    [129396] => Array
        (
            [id] => 129396
            [headline] => Bla bla bla title
            [intro] => This is cool article intro
            [needs_review] => 0
            [published] => 2014-12-16 09:17:00
            [unpublished] => 
            [hidden] => 0
            [no_single_page] => 0
            [permalink] => link-perma-link-here
            [internal_slug] => 
            [type_id] => 3
            [thread_id] => 0
            [news_id] => 0
            [header_game_id] => 0
            [puff_hh_id] => 0
            [puff_title] => 
            [hdrcol_id] => 900
            [review_queued] => 
            [lock_timeout] => 0
            [created] => 2014-12-16 09:17:00
            [updated] => 2015-01-16 13:51:30
            [created_by] => 84142
            [updated_by] => 84142
        )
    ...

返回类似的内容:

body

现在,我想在tco_module_eostext表格中附加$posts文字。

我是否可以使用自动执行此操作的查询,或者当时执行此操作然后附加到first0.1.second1.1.third1 first0.1.second2.2.third1 first0.n.second2.n.third1 数组?

当你有180000多个帖子时,查询的foreach方法有点慢。

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

如果您确定tco_module_eostext中每个article_id只有一行,则可以使用JOIN(内部联接),每个{只显示一行{ {1}}。

article_id

但是,如果SELECT a.*, t.body FROM tco_articles a JOIN tco_articles_modules m ON m.article_id = a.id JOIN tco_module_eostext t ON m.instance_id = t.instance_id //WHERE ..... 的其他两个表中没有条目,则不会显示某些文章的任何行。但仍有办法解决这个问题。我们可以使用article_id,然后确保只有LEFT OUTER JOIN中任何tco_module_eostext行中的任何行,我们才会进行加入。当其他表中没有数据时,这将确保您至少获得instace_id表中的文章信息。

tco_articles

答案 1 :(得分:0)

为什么不使用加入查询?

未经测试!:

SELECT
    article.*,
    text.body as bodytext
FROM
    tco_articles_modules AS modules LEFT OUTER JOIN
    tco_module_eostext AS text ON
        modules.instance_id = text.instance_id LEFT OUTER JOIN
    tco_articles AS article ON
        article.id = modules.article_id

它应该从article_id

获取所有分配有tco_articles_modules的文章

查看OUTER Join - 您可能希望将其替换为INNER JOIN以获得更快的查询。您还想在查询中过滤WHERE条件。还要注意mysql表中的正确索引 - 每个连接列都应该被编入索引 - 这样可以获得更快的结果。