2016-07-03 11 views
1

tag_idが1つ以上の値に等しいcontentitem_tag_mapテーブルからcontent_item_id -sの記事を取得しようとしています。特定のタグを持つ記事IDを検索するクエリJoomla 3

クエリ関与列をcontentitem_tag_mapテーブルから:

 

    | content_item_id | tag_id | 
    -------------------------------- 
    |    4 | 7  | 
    -------------------------------- 
    |    8 | 6  | 
    -------------------------------- 
    |    9 | 5  | 
    -------------------------------- 
    |    9 | 9  | 
    -------------------------------- 
    |    11 | 3  | 
    -------------------------------- 
    |    11 | 9  | 
    -------------------------------- 
    |    12 | 3  | 
    -------------------------------- 

私の質問は、どのようなクエリで私が取得することができ、問題は(3.5)Joomlaの中で、すべてのタグ団体がそのように、異なる行に表示されていることですcontent_item_id -sこのテーブルから2つ以上のtag_id-sが必要な場合は?例えば

:私はtag_id "3" "9" を持つすべてのcontent_item_id -sを取得したい

(結果は "11" でなければなりません)

OR

私が欲しいですtag_id "5" を持っているすべてのcontent_item_id -s "9"(結果は "9" でなければなりません)

私の現在のQUERを取得します次のようにyがある:

 

    $articleIDQuery = $db->getQuery(true); 
    $articleIDQuery->select('distinct content_item_id'); 
    $articleIDQuery->from($db->quoteName('#__contentitem_tag_map')); 
    $articleIDQuery->where($db->quoteName('tag_id')." IN (3,9)"); 

    $db->setQuery($articleIDQuery); 
    $taggedArticleID = $db->loadObjectList(); 

tag_id -s "3" OR "9" の代わりに "3" AND "9"

を持ってcontent_item_id -sを表示するこのクエリの結果は、私があれば、本当に感謝します誰でも私に希望の結果を得るためのアイデアを与えることができます。私はかなり多くのSQLの初心者ですので、答えをgoogle'ing私は本当に1つの文章に私の考えを置くことができないので、あまりにも複雑です。

ありがとうございます。

答えて

0

私は以下のクエリを使用しますが、非常に遅いです。

SELECT `jc`.* 
FROM `dbname`.`joomla_content` AS `jc` 
INNER JOIN `dbname`.`joomla_contentitem_tag_map` AS `jctm0` ON `jc`.`id` = `jctm0`.`content_item_id` AND `jctm0`.`tag_id` = 5 
INNER JOIN `dbname`.`joomla_contentitem_tag_map` AS `jctm1` ON `jc`.`id` = `jctm1`.`content_item_id` AND `jctm1`.`tag_id` = 9 
ORDER BY `jc`.`id` ASC 

クエリでさらにタグIDを選択すると、タグの速度が低下します。問題は、id_tagが5と9のすべてのコンテンツだけでなく、より多くのタグIDとこの2つを持つコンテンツも検索されることです。あなたは結果を反復してカウントしなければなりません。tot_tags result is =あなたの検索タグです。

また、joomlaプロジェクトで作業している場合は、JHelperTagsを使用してクエリを生成できます。あなたは、アレイ内の、その後、フィルタリングするすべてのタグIDを入れて:

このようなクエリを生成
$this->query = $tagsHelper->getTagItemsQuery($idTags, null, false, 'c.core_publish_up', 'DESC', false, 'all', '1');   
$this->db->setQuery($this->query); 
$results = $this->db->loadAssocList(); 

SELECT m.type_alias, m.content_item_id, m.core_content_id, count(m.tag_id) AS match_count, MAX(m.tag_date) as tag_date, MAX(c.core_title) AS core_title, MAX(c.core_params) AS core_params,MAX(c.core_alias) AS core_alias, MAX(c.core_body) AS core_body, MAX(c.core_state) AS core_state, MAX(c.core_access) AS core_access,MAX(c.core_metadata) AS core_metadata, MAX(c.core_created_user_id) AS core_created_user_id, MAX(c.core_created_by_alias) AS core_created_by_alias,MAX(c.core_created_time) as core_created_time, MAX(c.core_images) as core_images,CASE WHEN c.core_modified_time = '0000-00-00 00:00:00' THEN c.core_created_time ELSE c.core_modified_time END as core_modified_time,MAX(c.core_language) AS core_language, MAX(c.core_catid) AS core_catid,MAX(c.core_publish_up) AS core_publish_up, MAX(c.core_publish_down) as core_publish_down,MAX(ct.type_title) AS content_type_title, MAX(ct.router) AS router,CASE WHEN c.core_created_by_alias > ' ' THEN c.core_created_by_alias ELSE ua.name END AS author,ua.email AS author_email 
FROM #__contentitem_tag_map AS m 
INNER JOIN #__ucm_content AS c ON m.type_alias = c.core_type_alias AND m.core_content_id = c.core_content_id AND c.core_state IN (1) AND (c.core_publish_up = '0000-00-00 00:00:00' OR c.core_publish_up <= '2017-07-28 15:37:34') AND (c.core_publish_down = '0000-00-00 00:00:00' OR c.core_publish_down >= '2017-07-28 15:37:34') 
INNER JOIN #__content_types AS ct ON ct.type_alias = m.type_alias 
LEFT JOIN #__users AS ua ON ua.id = c.core_created_user_id 
WHERE m.tag_id IN (8,83,85) AND m.type_alias IN ('com_content.article','com_contact.contact','com_newsfeeds.newsfeed','com_users.user','com_content.category','com_contact.category','com_newsfeeds.category','com_tags.tag','com_banners.banner','com_banners.category','com_banners.client','com_users.note','com_users.category','com_weblinks.weblink','com_weblinks.category') AND c.core_access IN (0,1) 
GROUP BY m.type_alias, m.content_item_id, m.core_content_id 
ORDER BY MAX(`c`.`core_publish_up`) DESC 

あなたはフィルタデータ用much_count値を使用する場合は、あなたが見つけることができますon

関連する問題