2016-07-03 8 views
1

Ich versuche Artikel content_item_id -s von Joomla contentitem_tag_map Tabelle, wo tag_id entspricht einem oder mehreren Werten. Das Problem ist, dass in Joomla (3.5), werden alle Tag-Verbände in verschiedenen Zeilen angezeigt, wie folgt aus:Abfrage Artikel IDs zu finden, die bestimmte Tags haben Joomla 3

Abfrage beteiligten Spalten aus contentitem_tag_map Tabelle:

 

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

Meine Frage ist, mit welchem ​​Abfrage kann ich content_item_id -s aus dieser Tabelle, wenn es zwei oder mehr tag_id -s haben muss?

Zum Beispiel:

Ich möchte alle content_item_id es erhalten, die tag_id "3" UND "9" hat (Ergebnis sollte "11" sein)

OR

Ich mag zu erhalten all content_item_id es, die tag_id "5" UND "9" (Ergebnis sollte "9" sein)

Meine aktuellen quer hat y ist wie folgt:

 

    $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(); 

Diese Abfrageergebnisse content_item_id es in Anzeigen, die tag_id hat es "3" oder "9" anstelle von "3" und "9"

Ich würde wirklich schätzen, wenn Jeder kann mir Ideen geben, wie man die gewünschten Ergebnisse erzielt. Ich bin so ziemlich ein SQL-Neuling, also ist das googlen der Antworten viel zu kompliziert, da ich meine Idee nicht wirklich in einen Satz fassen kann.

Vielen Dank im Voraus.

Antwort

0

Ich benutze die Abfrage unten, ist aber sehr langsam.

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 

Wenn Sie mehr Tag-IDs in der Abfrage auswählen, verlangsamt es sich. Das Problem ist, dass die Abfrage alle Inhalte findet, die 5 und 9 id_tag ​​haben, aber auch Inhalte, die mehr tag ids und diese zwei haben. Sie müssen über Ergebnisse iterieren und zählen ist tot_tags Ergebnis ist = Tags Ihre Suche.

Oder wenn Sie an einem Joomla-Projekt arbeiten, können Sie einfach JHelperTags zum Generieren Ihrer Abfrage verwenden. Legen Sie alle Tag-IDs, die Sie in einem Array filtern möchten und dann:

$this->query = $tagsHelper->getTagItemsQuery($idTags, null, false, 'c.core_publish_up', 'DESC', false, 'all', '1');   
$this->db->setQuery($this->query); 
$results = $this->db->loadAssocList(); 

, dass eine Abfrage wie diese erzeugen:

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 

Wenn Sie much_count Wert für Filterdaten verwenden, können Sie finden auf