在MySQL中查询时连接表

din*_*o_d 6 php mysql sql wordpress

我有3个表:tco_articles,tco_module_eostexttco_articles_modules.我tco_articles有独特的id钥匙.每篇文章一篇.我的tco_module_eostext独特之处instance_id属于每篇文章.我tco_articles_modules包含了所有的article_ids,但是instance_id在其他表中使用了9倍.

在此输入图像描述

所以我可以article_idinstance_id,当你在查询中tco_module_eostext会返回空.

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

到目前为止,我有:

global $wpdb;
$posts = array();

$ids = $wpdb->get_results('SELECT DISTINCT instance_id, article_id FROM tco_articles_modules', ARRAY_A);
Run Code Online (Sandbox Code Playgroud)

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

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
        )
Run Code Online (Sandbox Code Playgroud)

你可以看到article_ids是相同的但是instance_id.当你放

$wpdb->get_results('SELECT body FROM tco_module_eostext WHERE instance_id=928617 ', ARRAY_A);
Run Code Online (Sandbox Code Playgroud)

你可能会变空,但是

$wpdb->get_results('SELECT body FROM tco_module_eostext WHERE instance_id=928618 ', ARRAY_A);
Run Code Online (Sandbox Code Playgroud)

你可以有一些正文.

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

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];

}
Run Code Online (Sandbox Code Playgroud)

返回的内容如下:

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
        )
    ...
Run Code Online (Sandbox Code Playgroud)

现在我想bodytco_module_eostext表中附加文本.

是否有一个查询我可以用来自动执行此操作或者当时执行此操作然后追加到$posts数组?

当你有180000+帖子时,查询的foreach方法有点慢.

任何帮助表示赞赏.

Tᴀʀ*_*ᴏᴏᴅ 2

如果您确定tco_module_eostext每个始终只有一行article_id,则可以使用JOIN(inner join),这只会为每个显示一行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 .....
Run Code Online (Sandbox Code Playgroud)

但是,如果其他两个表中没有该条目的条目,则不会显示某些条目的任何行article_id。但还是有办法解决这个问题的。我们可以使用LEFT OUTER JOIN,然后确保只有在tco_module_eostext任何行中有任何行时才进行连接instace_id。这将确保tco_articles当其他表中没有数据时您至少从表中获取文章信息。

SELECT a.*, t.body
FROM tco_articles a
LEFT OUTER JOIN tco_articles_modules m ON m.article_id = a.id AND EXISTS ( SELECT NULL FROM tco_module_eostext WHERE instance_id = m.instance_id )
LEFT OUTER JOIN tco_module_eostext t ON m.instance_id = t.instance_id
//WHERE .....
Run Code Online (Sandbox Code Playgroud)