[TYPO3-german] Alphabetische Filterung von News, DB-Query
David Greiner
davidgreiner at gmx.net
Tue Apr 9 15:37:00 CEST 2013
Hi Eike, hi Jan!
@Jan:
Deine weitere "unperformante" Idee hatte ich auch erst im Kopf. Entschied mich dann aber doch, das ganze direkt über SQL zu lösen. Ich glaub von den unperformanten Lösungen ist dies noch die perfomanteste ;)
Über $query->getQuerySettings()->setReturnRawQueryResult( TRUE ) ; kann ich letztlich auch im Fluid auf den Status (1/0) aus meiner Query zugreifen. Mittlerweile funktioniert alles so wie es soll, nur bin ich Fan davon, Code bei dem ich mir nicht sicher bin, zu optimieren.
@Eike:
Genau das möchte ich als Ergebnis bekommen, und bekomme ich auch schon. Richtig. Damit kann ich jetzt im Fluid folgendes abfackeln:
<f:for each="{alphas}" as="alpha" iteration="alphaIterator">
<f:if condition="{alpha.was_found} == 1">
<f:then>
<f:link.page additionalParams="{tx_news_pi1:{alphafilter: alpha.letter}}">{alpha.letter}</f:link.page>
</f:then>
<f:else>
{alpha.letter}
</f:else>
</f:if>
</f:for>
was mir auch eine korrekte Anzeige liefert.
Das ganze funktioniert also, ist aber nicht schön (oder doch???). Daher hatte ich gehofft, dass mir jemand bei einer perfomanteren SQL-Query behilflich sein könnte.
Gruß, David.
Gesendet: Dienstag, 09. April 2013 um 14:55 Uhr
Von: "Eike Starkmann" <starkmann at undkonsorten.com>
An: "German TYPO3 Userlist" <typo3-german at lists.typo3.org>
Betreff: Re: [TYPO3-german] Alphabetische Filterung von News, DB-Query
Hi David,
ok aber warum willst du das in SQL machen. Oder anders gefragt was
möchtest du als Ergebnis bekommen?
Letter | was_found
-------------------
A | 1
B | 0
... etc. Das hier?
Ich würde das doch lieber in php machen:
result=array();
foreach(A,B,C.. as letter){
result[letter]=find(letter);
}
function find(string letter){
number= SELCET COUNT(*) FROM tx_news_domain_model_news WHERE title LIKE
letter%
}
Der Code ist als Idee zu verstehen ;-)
Bis denne, Eike
On 09.04.2013 14:37, David Greiner wrote:
> Hi Eike!
>
> Danke für deine Antwort. Ich glaube ich hab mich ein wenig kompliziert ausgedrückt.
> Zu deinem Punkt 1)
> Das ist ja mit Extbase ohne Problem möglich. Z.B. durch $query->like('field', $alphafilter.'%');
>
> Zu deinem Punkt 2)
> Auch das ist mir bekannt. Trotzdem danke dafür.
>
> Was ich erreichen will, ist eine Ausgabe, die mir sagt, ob es News-Einträge gibt die mit A, B, C usw. beginnen, oder nicht.
> Ich habe nun eine Query die wahrscheinlich nicht sehr performant ist. Zudem wird für jeden Buchstaben eine Query durchgeführt.
>
> -------------------------
>
> SELECT l.`letter` , IF( fc.`first_char` IS NULL , 0, 1 ) AS `was_found`
> FROM (
> SELECT 'A' AS `letter`
> UNION SELECT 'B'
> UNION SELECT 'C'
> UNION SELECT 'D'
> UNION SELECT 'E'
> UNION SELECT 'F'
> UNION SELECT 'G'
> UNION SELECT 'H'
> UNION SELECT 'I'
> UNION SELECT 'J'
> UNION SELECT 'K'
> UNION SELECT 'L'
> UNION SELECT 'M'
> UNION SELECT 'N'
> UNION SELECT 'O'
> UNION SELECT 'P'
> UNION SELECT 'Q'
> UNION SELECT 'R'
> UNION SELECT 'S'
> UNION SELECT 'T'
> UNION SELECT 'U'
> UNION SELECT 'V'
> UNION SELECT 'W'
> UNION SELECT 'X'
> UNION SELECT 'Y'
> UNION SELECT 'Z'
> )l
> LEFT JOIN (
> SELECT x.`first_char`
> FROM (
> SELECT REPLACE( REPLACE( REPLACE( UPPER( SUBSTRING( `title` , 1, 1 ) ) , 'Ä', 'A' ) , 'Ü', 'U' ) , 'Ö', 'O' ) AS `first_char`
> FROM tx_news_domain_model_news
> WHERE `title` IS NOT NULL
> AND `title` != ''
> )x
> WHERE x.`first_char` IS NOT NULL
> GROUP BY x.`first_char`
> )fc ON l.`letter` = fc.`first_char` "
>
> ---------------------
>
> Gruß, David.
>
>
> Gesendet: Dienstag, 09. April 2013 um 13:54 Uhr
> Von: "Eike Starkmann" <starkmann at undkonsorten.com>
> An: "German TYPO3 Userlist" <typo3-german at lists.typo3.org>
> Betreff: Re: [TYPO3-german] Alphabetische Filterung von News, DB-Query
> Hallo David,
>
> es gibt da im Prinzip zwei Möglichkeiten:
>
> 1. Ein eigenes Statement, wie du schon vorgeschlagen hast.
> Dann wäre sowas wie SELECT * FROM table WHERE field LIKE a% OR LIKE A%
> dein Freund. Nachteil ist, das du nicht mehr FLOW kompatibel bist.
>
> 2. Möglichkeit mit Extbase alle Daten hohlen und in ein Array speichern.
> $this->defaultQuerySettings->setReturnRawQueryResult(TRUE); Damit
> bekommst du eine Array-Ergebnisliste zurück. Auf dieser kannst du dann
> arbeiten. Nachteil unnötig großes Array und Query.
>
>
> Bis denne, Eike
>
>
>
>
>
> On 09.04.2013 10:34, David Greiner wrote:
>> Hallo Liste und MySQL-Profis!
>>
>> Ich sitze gerade vor der Aufgabe, für eine Newsliste (tx_news) eine alphabetische Filterung umzusetzen. Die News-Extension entsprechend zu erweitern, dass nur noch News ausgegeben werden derer Titel mit einem bestimmten Buchstaben beginnen, ist nicht weiter schwer.
>> Herausfordernder ist es, eine Datenbank-Query zu entwerfen, die überprüft, ob die Auswahl eines Buchstabens ein Ergebnis zu erwarten hat oder nicht. Diese Query benötige ich, um in der Filteransicht auch nur die jenigen Buchstaben zu verlinken, die ein Ergebnis erwarten. Alle anderen sollen ausgegraut sein.
>>
>> Vermutlich werde ich eine solche Query nicht mit Extbase-Bordmitteln umsetzen können und werde auf "$query->statement(...)" zurückgreifen müssen, das ist aber nicht schlimm.
>> Bestenfalls erhalte ich im Result eine temporäre Spalte (z.B. hasResult) die in Abhängigkeit vom getesteten Buchstaben eine 1 oder 0 enthält. Somit könnte ich beim Rendern der alphabetischen Filterleiste mit Fluid über eine Condition entscheiden ob ein Buchstabe aktiv/inaktiv sein soll.
>>
>> Kann mir jemand eine Query oder eine grobe Richtung dafür vorschlagen?
>>
>> Viele Grüße, David.
>> _______________________________________________
>> TYPO3-german mailing list
>> TYPO3-german at lists.typo3.org
>> http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german
>>
>
>
> --
> EIKE STARKMANN
> starkmann at undkonsorten.com
> +49.30.20236354 [fon]
>
> UNDKONSORTEN GBR
> Waldemarstr. 38
> 10999 Berlin
>
> www.undkonsorten.com[http://www.undkonsorten.com][http://www.undkonsorten.com[http://www.undkonsorten.com]]
> +49.30.20236354 [fon]
> +49.30.20236354-9 [fax]
>
> thomas alboth, felix althaus + jochen biedermann [gesellschafter]
> _______________________________________________
> TYPO3-german mailing list
> TYPO3-german at lists.typo3.org
> http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german[http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german][http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german[http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german]]
> _______________________________________________
> TYPO3-german mailing list
> TYPO3-german at lists.typo3.org
> http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german[http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german]
>
--
EIKE STARKMANN
starkmann at undkonsorten.com
+49.30.20236354 [fon]
UNDKONSORTEN GBR
Waldemarstr. 38
10999 Berlin
www.undkonsorten.com[http://www.undkonsorten.com]
+49.30.20236354 [fon]
+49.30.20236354-9 [fax]
thomas alboth, felix althaus + jochen biedermann [gesellschafter]
_______________________________________________
TYPO3-german mailing list
TYPO3-german at lists.typo3.org
http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german[http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german]
More information about the TYPO3-german
mailing list