0

私は他の人の助けを借りて作られたこのSQLを持っています。

$sql ="
select e.*, i.*, group_concat( t.tag separator ',') as tag_list
from nv_entries e
JOIN nv_tags t on t.entrie_id = e.id
LEFT JOIN nv_images i on i.entrie_id = e.id

where t.tag in ( $tag_list )
group  by e.id
having count(t.id) = $num_tags ";

結果は次のとおりです(ここでは1つのエントリのみを表示しますが、それ以上になる可能性があります)。

[1] => Array
        (
            [id] => 2
            [band] => Kids for Cash
            [album] => No More Walls E.P.
            [label] => 
            [year] => 1986
            [text] => Text about album kids for cash.
            [entrie_id] => 2
            [source] => img02_9lch1.png
            [tag_list] => tree
        )

タグについては、エントリが持っているすべてのタグを表示し、結果を取得するために使用されたタグを強調表示する必要があります。この場合[tag_list] => tree、検索フィールドで使用されたタグが1つだけ表示されます。私の質問は、どうすればこのような結果を得ることができますか?:

            ...
            [tag_list] => tree, green, foo, bar
            [used_tags] => tree
        )

配列としても良いのですが、1つだけの場合は配列もお願いします。

4

1 に答える 1

1

私が正しく理解していれば、持っている状態で>=を使用してください

$sql ="
select e.*, i.*, group_concat( t.tag separator ',') as tag_list
from nv_entries e
LEFT JOIN nv_images i on i.entrie_id = e.id
JOIN nv_tags t on t.entrie_id = e.id

where t.tag in ( $tag_list )
group  by e.id
having count(t.id) >= $num_tags ";

追加

サブクエリアプローチ:

$sql ="
select e.*, i.*, group_concat( t.tag separator ',') as tag_list
from nv_entries e
JOIN nv_tags t on t.entrie_id in (
select se.id 
from nv_entries se
JOIN nv_tags st on st.entrie_id = se.id

where st.tag in ( $tag_list )

group  by se.id
having count(st.id) >= $num_tags

)
    LEFT JOIN nv_images i on i.entrie_id = e.id
    WHERE 1
    group by e.id
 ";

サブクエリでは、少なくとも要求されたタグのエントリhavinのIDリストを取得し、メインクエリではすべてのinfoxを取得します。

固定クエリを追加します(askerコメントを参照)

サブクエリアプローチ、「e」と「t」の間の失われた結合を修正します。

$sql ="
select e.*, i.*, group_concat( t.tag separator ',') as tag_list
from nv_entries e
JOIN nv_tags t on t.entrie_id = e.id 
    LEFT JOIN nv_images i on i.entrie_id = e.id
    WHERE e.id in  (
select se.id 
from nv_entries se
JOIN nv_tags st on st.entrie_id = se.id

where st.tag in ( $tag_list )

group  by se.id
having count(st.id) >= $num_tags

)
    group by e.id
 ";
于 2012-07-03T11:19:44.970 に答える