我有3个表:tco_articles
,tco_module_eostext
和tco_articles_modules
。我的tco_articles
具有唯一的id
密钥。每篇文章一篇。我的tco_module_eostext
具有属于每篇文章的唯一instance_id
。
我的tco_articles_modules
包含所有article_id
个,但在其他表格中使用的instance_id
为9倍。
所以我可以article_id
instance_id
tco_module_eostext
,global $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方法有点慢。
感谢任何帮助。
答案 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表中的正确索引 - 每个连接列都应该被编入索引 - 这样可以获得更快的结果。