Hilfe zu SQL-Abfrage für Content Allocation Artikel-Liste

Gesperrt
derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Hilfe zu SQL-Abfrage für Content Allocation Artikel-Liste

Beitrag von derSteffen »

Hallo,

ich benötige Hilfe bei einer SQL-Abfrage für die Artikel-Liste. Es wäre schön, wenn mir jemand helfen könnte.

Das ist ein teil des Modul-Inputs, in dem ich die angelegten Content-Allocation anzeigen kann und auch auswählen kann

Code: Alles auswählen

echo '
	<tr>
        <td class="text" style="border-bottom: 1px solid silver; vertical-align:top;">'.mi18n("Bei Content Allocation").'</td>
          <td style="border-bottom: 1px solid silver;">'.mi18n("Anzuzeigende Artikel wählen.<br /> Mehrfachauswahl mit Strg möglich. Bestehende Markierung(en) kann mit STRG und Klick aufgehoben werden.").'<br />
          <input type="hidden" name="CMS_VAR[500]" value="CMS_VALUE[500]" id="hidden_value_500">
          <select name="value_500" multiple="multiple" onChange="setValues(this)" size="8" style="width: 300px">';
   
    $arrCa = explode(",","CMS_VALUE[500]");
  $sql = "SELECT * FROM ".$cfg["tab"]["pica_lang"]." AS picalang JOIN ".$cfg["tab"]["pica_alloc"]." AS picaalloc on picalang.idpica_alloc=picaalloc.idpica_alloc WHERE picalang.idlang=$lang ORDER BY picaalloc.sortorder asc";
    $db->query($sql);
   
    while ($db->next_record()) {
       $selected = (in_array($db->f("idpica_alloc"),$arrCa)) ? " selected=\"selected\"" : "";
       echo '<option value="'.$db->f("idpica_alloc"),$language.'"'.$selected.'>'.$db->f("name").'</option>';
    }
    echo '</select>
          </td>'; 

	echo '</tr>'."\n";
Und jetzt möchte ich mit einer SQL-Abfrage die Artikel anzeigen lassen, mit der CA, die ich in der Templatekonfiguration des Modulinputs ausgewählt habe

Code: Alles auswählen

$sql =  'SELECT
                tblData.value AS headline,
                artlang.pagetitle AS pagetitle,
                artlang.summary AS summary,
                artlang.idart AS idart,
                artlang.idartlang AS idartlang,
                artlang.lastmodified AS lastmodified,
                artlang.created AS created,
                artlang.published AS published,
                catlang.name AS category,
                catlang.startidartlang AS startid,
                catart.is_start AS isstart,
                catart.idcat AS idcat,
                catart.idcatart AS idcatart,
		pica.idartlang AS picaidartlang,
		pica.idpica_alloc AS idpica		
            FROM 
                ' . $cfg["tab"]["cat_art"] . ' AS catart,
                ' . $cfg["tab"]["art_lang"] . ' AS artlang,
                ' . $cfg["tab"]["cat_lang"] . ' AS catlang,
                ' . $cfg["tab"]["content"] . ' AS tblData,
		' . $cfg["tab"]["pica_alloc_con"] . ' AS pica,
				' . $cfg["tab"]["pica_lang"] . ' AS picalang,
				' . $cfg["tab"]["pica_alloc"] . ' AS picaalloc
            WHERE
		catart.idcat IN (' . $sSelCats . ') AND
                artlang.idlang = ' . $lang . ' AND
                tblData.idartlang = artlang.idartlang AND
                catlang.idlang = artlang.idlang AND
                catlang.idcat = catart.idcat AND
		artlang.idart <> '.$idart.' AND
                artlang.idart = catart.idart ';   

    $sql .= 'AND artlang.online = 1 ';
    $sql .= 'AND ' . $aSettings["HeadlineIdentifier"] . ' ';

    // Sort by
    $sql .= 'ORDER BY ' . $aSettings["SortBy"] . ' ' . $aSettings["SortDir"] . ' ';

Das Problem besteht zur Zeit, dass ich nicht weiß wie ich abfragen kann "Zeige die Artikel mit dem ausgewählten CA". Es muss noch irgendwas in die WHERE-Abfrage ... aber was?!

Ich wäre wirklich sehr sehr dankbar, wenn mir jemand hilft!

MfG Steffen
Spider IT
Beiträge: 1416
Registriert: Fr 3. Dez 2004, 10:15

Re: Hilfe zu SQL-Abfrage für Content Allocation Artikel-List

Beitrag von Spider IT »

Hallo Steffen,

so ohne mich in dem Bereich Content Allocation auszukennen:
derSteffen hat geschrieben:

Code: Alles auswählen

...
  $arrCa = explode(",","CMS_VALUE[500]");
...
       $selected = (in_array($db->f("idpica_alloc"),$arrCa)) ? " selected=\"selected\"" : "";
...
Daraus leite ich ab:

Code: Alles auswählen

AND picaalloc.idpica_alloc IN (' . explode(',', "CMS_VALUE[500]") . ')
Gruß
René
derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Re: Hilfe zu SQL-Abfrage für Content Allocation Artikel-List

Beitrag von derSteffen »

Hallo René,

mhm leider auch nicht.

Ich habe es auch noch mal damit getestet:

Code: Alles auswählen

picaalloc.idpica_alloc IN (' .$strCa. ')
Ich muss auch einen weiteren Fehler gemacht haben:

Bei dieser Abfrage

Code: Alles auswählen

   $sql =  'SELECT
                tblData.value AS headline,
                artlang.pagetitle AS pagetitle,
                artlang.summary AS summary,
                artlang.idart AS idart,
                artlang.idartlang AS idartlang,
                artlang.lastmodified AS lastmodified,
                artlang.created AS created,
                artlang.published AS published,
                catlang.name AS category,
                catlang.startidartlang AS startid,
                catart.is_start AS isstart,
                catart.idcat AS idcat,
                catart.idcatart AS idcatart,
				pica.idartlang AS picaidartlang,
				pica.idpica_alloc AS idpica 			
            FROM 
                ' . $cfg["tab"]["cat_art"] . ' AS catart,
                ' . $cfg["tab"]["art_lang"] . ' AS artlang,
                ' . $cfg["tab"]["cat_lang"] . ' AS catlang,
                ' . $cfg["tab"]["content"] . ' AS tblData,
            	' . $cfg["tab"]["pica_alloc_con"] . ' AS pica,
                ' . $cfg["tab"]["pica_lang"] . ' AS picalang,
                ' . $cfg["tab"]["pica_alloc"] . ' AS picaalloc
            WHERE
				catart.idcat IN (' . $sSelCats . ') AND
                artlang.idlang = ' . $lang . ' AND
                tblData.idartlang = artlang.idartlang AND
                catlang.idlang = artlang.idlang AND
                catlang.idcat = catart.idcat AND
				artlang.idart <> '.$idart.' AND
				picaalloc.idpica_alloc IN (' .$strCa. ') AND	
                artlang.idart = catart.idart ';
Wird mir jeder Artikel 5mal angezeigt (also 2 Artikel x 5 angelegte Content Allocations) !

Ich weiß ja auch gar nicht ob meine Abfragen richtig sind. Ich habe von SQL gar keine Ahnung. Ich weiß nicht ob man das alles braucht in der SELECT und in der FROM und wie man das verarbeitet.

Es gibt in der DB die con_pica_alloc, con_pica_alloc_con und con_pica_lang.

In der con_pica_alloc gibt es die idpica_alloc und die (parentid und sortorder, die ich aber glaube ich gar nicht brauch)

In der con_pica_alloc_con gibt es idpica_alloc (= ID einer angelegten CA) und idartlang (der Artikel mit einer zugewiesenen CA) ... Allerdings, sobald ein Artikel mehrer CA zugewiesen bekommt, ist dieser Artikel hier auch zweimal/mehrmals aufgeführt (also in neuer Zeile)

in der con_pica_lang gibt es idpica_alloc, idlang, name (= der Name der CA), online

Ich habe mich aus diesem Modul bedient (http://forum.contenido.org/viewtopic.ph ... allocation) aber ich möchte nicht, wie in dem Modul mit Parent arbeiten, sondern ich möchte die CA dafür nutzen, dass ich dem Artikel eine Art "Zurordnung" mitgeben kann und darausdann Listen genriert werden!

MfG Steffen
Spider IT
Beiträge: 1416
Registriert: Fr 3. Dez 2004, 10:15

Re: Hilfe zu SQL-Abfrage für Content Allocation Artikel-List

Beitrag von Spider IT »

Das mehrfache Vorkommen kannst du durch Ändern von SELECT in SELECT DISTINCT verhindern (gleiche Zeilen werden zu eine Zeile zusammengefasst).

Deine Variable $strCA, existiert die überhaupt?
Im Input-Bereich hast du eine $arrCA, aber die existiert wie gesagt im Input-Bereich, und der hat nichts mit dem Output-Bereich zu tun.
Die einzige Art der Variablenübergabe zwischen Input- und Output-Bereich ist Contenido mit den CMS_VALUE[]-Variablen.

Generell sollte der von mir gelieferte Codeschnippsel funktionieren.
Der einzige (mir vorstellbare) Grund, warum das Ergebnis nicht das Erwünschte ist, ist, dass die Angabe catart.idcat IN (' . $sSelCats . ') im WHERE-Clause das Ergebnis zu sehr einschränkt.

Gruß
René
derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Re: Hilfe zu SQL-Abfrage für Content Allocation Artikel-List

Beitrag von derSteffen »

Okay, dass SELECT DISTINCT hat tatsächlich bewirkt, dass jetzt wieder nur ein Artikel ausgegeben wird ... das ist schon mal gut! Danke schön!

Wenn ich das eingeb

Code: Alles auswählen

AND picaalloc.idpica_alloc IN (' . explode(',', "CMS_VALUE[500]") . ')
wir gar kein Artikel angezeigt, obqohl ein Artikel die ausgewählte CA hat.

Wenn ich jetzt

Code: Alles auswählen

AND picaalloc.idpica_alloc = 4
mache (ID der zugewisenen CA) dann passiert auch nichts. Also denke ich mal die Abfrage erkennt gar nicht die idpica_alloc.

MfG
Spider IT
Beiträge: 1416
Registriert: Fr 3. Dez 2004, 10:15

Re: Hilfe zu SQL-Abfrage für Content Allocation Artikel-List

Beitrag von Spider IT »

Da bin ich dann im Moment überfragt.
Wie gesagt, mit dem CA-Bereich kenne ich mich (noch) nicht aus.
Ich kann mir das mal ansehen, aber nicht mehr heute.
Wenn du das möchtest, dann schick mir die Zugangsdaten per PN (Contenido und phpMyAdmin).

Gruß
René
derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Re: Hilfe zu SQL-Abfrage für Content Allocation Artikel-List

Beitrag von derSteffen »

Hallo René,

danke für das Angebot. Z.Z. ist alles offline, ich richte das denn bei einem Online-Projekt ein.

Vielen Dank

MfG Steffen
derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Re: Hilfe zu SQL-Abfrage für Content Allocation Artikel-List

Beitrag von derSteffen »

Wie es aussieht haben meine 5.769 Test-Versuche zu einem Ergebnis geführt!

Input muss so aussehen (Teil):

Code: Alles auswählen

 echo '
	<tr>
        <td class="text" style="border-bottom: 1px solid silver; vertical-align:top;">'.mi18n("Bei Content Allocation").'</td>
          <td style="border-bottom: 1px solid silver;">'.mi18n("Anzuzeigende Artikel wählen.<br /> Mehrfachauswahl mit Strg möglich. Bestehende Markierung(en) kann mit STRG und Klick aufgehoben werden.").'<br />
          <input type="hidden" name="CMS_VAR[500]" value="CMS_VALUE[500]" id="hidden_value_500">
          <select name="value_500" multiple="multiple" onChange="setValues(this)" size="8" style="width: 300px">';
   
    $arrCa = explode(",","CMS_VALUE[500]");
   // $sql = "SELECT * FROM ".$cfg['tab']['art_spec']." WHERE client='".$client."' AND online='1' AND lang='".$lang."'";    
	// $sql = "SELECT a.idpica_alloc as idpica_alloc, a.name as name FROM ".$cfg["tab"]["pica_lang"]." AS a JOIN ".$cfg["tab"]["pica_alloc"]." AS b on a.idpica_alloc=b.idpica_alloc ORDER BY b.sortorder asc";
	$sql = "SELECT * FROM ".$cfg["tab"]["pica_lang"]." AS picalang JOIN ".$cfg["tab"]["pica_alloc"]." AS picaalloc on picalang.idpica_alloc=picaalloc.idpica_alloc WHERE picalang.idlang=$lang ORDER BY picaalloc.sortorder asc";

    $db->query($sql);
   
    while ($db->next_record()) {
       $selected = (in_array($db->f("idpica_alloc"),$arrCa)) ? " selected=\"selected\"" : "";
       echo '<option value="'.$db->f("idpica_alloc").'"'.$selected.'>'.$db->f("name").'</option>';
    }
    echo '</select>
          </td>'; 

	echo '</tr>."\n";
Der Output muss so aussehen (Teil):

Code: Alles auswählen

$sql =  'SELECT DISTINCT 
                tblData.value AS headline,
                artlang.pagetitle AS pagetitle,
                artlang.summary AS summary,
                artlang.idart AS idart,
                artlang.idartlang AS idartlang,
                artlang.lastmodified AS lastmodified,
                artlang.created AS created,
                artlang.published AS published,
                catlang.name AS category,
                catlang.startidartlang AS startid,
                catart.is_start AS isstart,
                catart.idcat AS idcat,
                catart.idcatart AS idcatart
            FROM 
                ' . $cfg["tab"]["cat_art"] . ' AS catart,
                ' . $cfg["tab"]["art_lang"] . ' AS artlang,
                ' . $cfg["tab"]["cat_lang"] . ' AS catlang,
                ' . $cfg["tab"]["content"] . ' AS tblData,
            	' . $cfg["tab"]["pica_alloc_con"] . ' AS pica,
                ' . $cfg["tab"]["pica_lang"] . ' AS picalang,
                ' . $cfg["tab"]["pica_alloc"] . ' AS picaalloc
            WHERE
				catart.idcat IN (' . $sSelCats . ') AND
                artlang.idlang = ' . $lang . ' AND
                tblData.idartlang = artlang.idartlang AND
                catlang.idlang = artlang.idlang AND
                catlang.idcat = catart.idcat AND
				artlang.idart <> '.$idart.' AND	
                artlang.idart = catart.idart AND
           pica.idpica_alloc IN (' .$arrCa. ') AND 
         pica.idartlang = artlang.idartlang ';
MfG Steffen
derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Re: Hilfe zu SQL-Abfrage für Content Allocation Artikel-List

Beitrag von derSteffen »

Hallo liebe Community,

ichhabe jetzt doch noch eine Frage!

SELECT DISTINCT kann wohl dazu führen, das die Server-Belastung sehr hoch ist! Kann ich eventuell doppelte Einträge auch anders herausfiltern. eventuell mit Group? Oder kann ich meine SQL-Abfrage auch so stricken, dass die Artikel, welche sich in der PICA-Auswahl befinden, nur einmal angezeigt werden?

Code: Alles auswählen

$sql =  'SELECT DISTINCT'."\n".
                '    tblData.value AS headline,'."\n".
                '    artlang.pagetitle AS pagetitle,'."\n".
                '    artlang.summary AS summary,'."\n".
                '    artlang.idart AS idart,'."\n".
                '    artlang.idart AS idartlang,'."\n".
                '    artlang.lastmodified AS lastmodified,'."\n".
                '    artlang.modifiedby AS autor,'."\n".
                '    artlang.created AS created,'."\n".
                '    artlang.published AS published,'."\n".
                '    artlang.idartlang AS idartlang,'."\n".
                '    catlang.name AS category,'."\n".
                '    catlang.startidartlang AS startid,'."\n".
                '    catart.is_start AS isstart,'."\n".
                '    catart.idcat AS idcat,'."\n".
                '    catart.idcatart AS idcatart'."\n".
                'FROM'."\n".
                '    '.$cfg['tab']['cat_art'].' AS catart,'."\n".
                '    '.$cfg['tab']['art_lang'].' AS artlang,'."\n".
                '    '.$cfg['tab']['cat_lang'].' AS catlang,'."\n".
                '    '.$cfg['tab']['content'].' AS tblData,'."\n".
				'	'. $cfg["tab"]["pica_alloc_con"] . ' AS pica,'."\n".
                '	'. $cfg["tab"]["pica_lang"] . ' AS picalang,'."\n".
                '	'. $cfg["tab"]["pica_alloc"] . ' AS picaalloc'."\n".
                'WHERE'."\n".
                '    catart.idcat IN ('.$sSelCats.') AND'."\n".
				'    pica.idpica_alloc IN ('.$arrCa.') AND'."\n".				
                '    artlang.idlang = '.$lang.' AND'."\n".
                '    tblData.idartlang = artlang.idartlang AND'."\n".
                '    catlang.idlang = artlang.idlang AND'."\n".
                '    catlang.idcat = catart.idcat AND'."\n".
				'    pica.idartlang = artlang.idartlang AND'."\n".
                '    artlang.idart = catart.idart ';
Vielen Dank

MfG Steffen
Gesperrt