programing

MySQL에서 쿼리할 때 테이블 연결

easyjava 2023. 10. 1. 23:06
반응형

MySQL에서 쿼리할 때 테이블 연결

테이블이 3개 있습니다.tco_articles,tco_module_eostext그리고.tco_articles_modules.나의tco_articles독특함이 있습니다.id열쇠. 기사마다 하나씩. 내.tco_module_eostext독특함이 있습니다.instance_id그것은 각각의 기사에 속합니다.tco_articles_modules모두 포함함article_ids, 하지만 9배는 가지고 있습니다.instance_id다른 테이블에서 사용되는 s.

enter image description here

제가 가질 수 있게.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);

이렇게 하면 다음과 같은 모든 인스턴스와 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
        )

당신은 알 수 있습니다.article_ids는 같지만,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배열?

각 조회 방법은 180000개 이상의 게시물이 있을 때 다소 느립니다.

어떤 도움이든 감사히 받겠습니다.

항상 하나의 행만 있는 경우tco_module_eostext각각을 상대로article_id, 사용가능JOIN(inner 조인), 각 행에 하나씩만 표시됩니다.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다른 테이블에 데이터가 없을 때 테이블.

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 .....

join과 함께 쿼리를 사용하는 것은 어떨까요?

테스트 안 함!:

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

더 빠른 쿼리를 위해 외부 조인을 내부 조인으로 대체할 수 있습니다.또한 쿼리에서 필터링하기 위한 WHERE 조건을 원할 수도 있습니다.또한 mysql 테이블의 올바른 색인을 주의하십시오. 각 조인 열은 색인화되어야 합니다. 이는 훨씬 더 빠른 결과를 얻을 수 있습니다.

언급URL : https://stackoverflow.com/questions/34412630/connecting-tables-when-querying-in-mysql

반응형