2016-05-22 19 views
-1

PDOでSQLクエリを作成して、左結合と合計のカウントを取得する必要があります。ここSQL + LEFT JOIN + LIKE + COUNT

私のDB

テーブルの内容

ID | TYPE  | ACTION       | 
1 | picture  | ['1324234324', '4545647777']  | 
1 | picture  | ['4545647777', '7888945555']  | 
1 | video  | ['1324234324']     | 

テーブルページ

ID | PAGEID           | 
1 | 1324234324          | 
1 | 4545647777          | 
1 | 7888945555          | 

そしてここで私の質問!私はpageidにして、各タイプのCOUNT()を取得したい

例:4545647777は2画像を1画像と1ビデオ

  • ページを持っている

    • ページ1324234324(これは私が結果のために必要なものです)

      :0ビデオ
    • ページ7888945555は1枚の画像と0ビデオ

    が今私のクエリである持っています

    しかし、結果は本当に私が期待しているものではありません: -/

    誰か助けてくれますか?

  • +0

    「id」列とは何ですか?なぜ彼らはすべて1ですか? – Terminus

    +1

    また、 'content'テーブルを正規化すると、この全体がより簡単になるでしょう – Terminus

    +2

    あなたは' A 'を持っています。page_id'という名前の列はありませんが、 'PAGEID'と' A.page_name'は 'A.page'と' B.countId'を 'B.ID'として使ってはいけませんか? * "しかし、結果は本当に私が期待しているものではありません" * - あなたは今何を得ていますか?何かエラーがありますか、それらをチェックしていませんか?あなたのコンソールでは、PDOではなく、PDOをまだ作成していないのですか?あなたの質問は不明確です。 –

    答えて

    1

    はこのお試しください:-(そのなって10時間と私は見当もつかない:

    select 
    page_name 
    , (select COUNT(*) from content where type = 'picture' and CONTAINS(action, page.page_id)) as total_picture 
    , (select COUNT(*) from content where type = 'video' and CONTAINS(action, page.page_id)) as total_video 
    from page 
    

    を(またはCONTAINSの代わりに「のような」を使用)を使用すると、部品に必要なもの

    +0

    (SELECT COUNT(*)FROM content where type = 'picture')とアクションLIKE CONCAT( '%'、A.pageid、 '%'))AS total_picture –

    1

    ブレークダウン書きますそのためのクエリ。それを一緒に参加。

    あなたは、各pageidcontentにおける各行のpageからを見つける必要があります。あなたは、個々のが含まれているcontentからの行数を必要としますs。

    SELECT p.pageid, vid.numVideo, pic.numPicture 
    FROM page p 
    LEFT JOIN (
        SELECT p.pageid, COUNT(id) AS numVideo 
        FROM page p 
        INNER JOIN content c 
        ON c.content LIKE CONCAT('%', p.pageid, '%') 
        WHERE c.type = 'video' 
        GROUP BY p.pageid 
    ) vid ON vid.pageid = p.pageid 
    LEFT JOIN (
        SELECT p.pageid, COUNT(id) AS numPicture 
        FROM page p 
        INNER JOIN content c 
        ON c.content LIKE CONCAT('%', p.pageid, '%') 
        WHERE c.type = 'picture' 
        GROUP BY p.pageid 
    ) pic ON pic.pageid = p.pageid 
    

    パフォーマンスを向上させるには、データの格納方法を変更します。 3番目の表を使用して、コンテンツとページの関係を保存します。これにより、新しいクエリがインデックスを利用できるようになります。

    SELECT p.pageid, type, count(*) cnt FROM `PAGE` p 
    LEFT JOIN `CONTENT` c ON c.action like concat('%', p.pageid, '%') 
    Group By PAGEID, `type` 
    

    :このよう

    0

    1. PAGEIDarcherカラム、ACTIONarcherです。
    2. PAGEIDおよびCONTENT.idは、すべて1のような固有番号ではありません。idです。