Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [SQL/PHP] Herausfinden ob Suchergebnis mit Ziffer beginnt (https://www.delphipraxis.net/67495-%5Bsql-php%5D-herausfinden-ob-suchergebnis-mit-ziffer-beginnt.html)

faux 15. Apr 2006 15:46


[SQL/PHP] Herausfinden ob Suchergebnis mit Ziffer beginnt
 
Hallo!

Ich habe ein Skript programmiert, das Daten aus einer Datenbank ausliest und diese dann ausgibt.
Man hat mehrere Suchkriterien nach denen man suchen kann.
Wie bereits in diesem Thread erwähnt habe ich eine Filterleiste gemacht, mit denen man die Ergebnisse nach Anfangsbuchstaben filtern kann.
Das ganze funktioniert auch schon sehr gut, nur will der Inhaber der Seite jetzt auch noch, dass nur die Buchstaben angezeigt werden, die auch ein Ergebnis liefern (immer diese Extrawünsche :roll:).
Bei Buchstaben mache ich das so:
SQL-Code:
SELECT SUBSTRING(serie,1,1) AS used
FROM page_series AS s, page_types AS t, page_publishers AS p
WHERE s.type = t.id
  AND p.id = s.publisher
  AND serie LIKE '%cat%'
GROUP BY used
ORDER BY used ASC
In diesem Fall hat jemand nach cat im Feld serie gesucht. Jetzt bekomme ich als Resultat dieses Querys 'B', 'C' und '.', weil sowohl Einträge mit B, C wie auch mit einem Punkt beginnend verfügbar sind.
Ich habe jetzt mit der PHP-Funktion in_array() jeden Buchstaben vor der Ausgabe überprüft:
Code:
[color=#800080]for[/color] ([color=#000080][i]$i[/i][/color] = [color=red]65[/color]; [color=#000080][i]$i[/i][/color] <= [color=red]90[/color]; [color=#000080][i]$i[/i][/color]++)
{
  [color=#000080][i]$a[/i][/color] = chr([color=#000080][i]$i[/i][/color]);
  [color=#FF8000]// Print only chars which have a result.[/color]
  [color=#800080]if[/color] (in_array([color=#000080][i]$a[/i][/color], [color=#000080][i]$need[/i][/color]))
  {
    [color=#000080][i]$charlist[/i][/color] .= [color=#008000]"<a href=\"[/color][color=#000080][i]$_SERVER[/i][/color][color=#008000][PHP_SELF]?char=[/color][color=#000080][i]$a[/i][/color][color=#000080][i]$VARS[/i][/color][color=#008000][view][/color][color=#000080][i]$VARS[/i][/color][color=#008000][find]\">[/color][color=#000080][i]$a[/i][/color][color=#008000]</a> | "[/color];
  }
}
Das funktioniert auch alles ganz gut, nur will ich nicht für 0, 1, 2, .. 9 einen extra Link machen, da das überflüssig wäre. Ich will das ganze mit einem Link '0-9' erledigen, der alle Nummern anzeigt und einen Link mit etc. der alle Sonderzeichen ausgibt.
Soweit funktioniert nochimmer alles, bis auf die Tatsache, das mir kein vernünftiger Weg einfällt, wie ich überprüfe ob die Links 0-9 bzw etc. überhaupt benötigt werden, also angezeigt werden sollen.
Desweiteren wollte ich noch fragen, ob das Suchen des Buchstabens mit der Funktion in_array() sinnvoll ist oder ob das Resourcenverschwendung ist und jemandem etwas besseres einfällt. Gibts überhaupt allgemein eine Bessere Lösung?

Wäre über jeden Tipp froh.

Grüße
Faux

marabu 15. Apr 2006 18:42

Re: [SQL/PHP] Herausfinden ob Suchergebnis mit Ziffer beginn
 
Hallo Faux,

ich weiß ja nicht wie teuer deine Abfrage ist, aber den relevanten set of characters könntest du auch per SQL bestimmen:

SQL-Code:
SELECT DISTINCT UPPER(SUBSTRING(serie, 1, 1)) FROM ...
Grüße vom marabu

faux 18. Apr 2006 14:35

Re: [SQL/PHP] Herausfinden ob Suchergebnis mit Ziffer beginn
 
Also ich habe jetzt pro Link ein Query gemacht, was sicherlich nicht zu empfehlen ist.

Buchstaben:
SQL-Code:
SELECT SUBSTRING(serie,1,1) AS chars
FROM page_series AS s, page_types AS t, page_publishers AS p
WHERE s.type = t.id
  AND p.id = s.publisher
  AND serie LIKE '%cat%'
GROUP BY SUBSTRING(serie,1,1)
ORDER BY SUBSTRING(serie,1,1) ASC
Zahlen:
SQL-Code:
SELECT SUBSTRING(serie,1,1) AS chars
FROM page_series AS s, page_types AS t, page_publishers as p
WHERE s.type = t.id
  AND p.id = s.publisher
  AND serie LIKE '%cat%'
  AND SUBSTRING(serie,1,1) BETWEEN '0' AND '9'
LIMIT 1
Sonderzeichen:
SQL-Code:
SELECT SUBSTRING(serie,1,1) AS chars
ROM page_series AS s, page_types AS t, page_publishers as p
WHERE s.type = t.id
  AND p.id = s.publisher
  AND serie LIKE '%cat%'
  AND SUBSTRING(serie,1,1) NOT BETWEEN '0' AND '9'
  AND LOWER(SUBSTRING(serie,1,1)) NOT BETWEEN 'a' AND 'z'
LIMIT 1
Und jetzt überprüfe ich pro Query, ob ein Result zurück kommt. Beim 1. mache ich pro Result einen Link (A-Z) und bei den Resultichen mache ich, wenn es ein Result gibt, einen 0-9 Link und beim 2. einen etc. Link.
Fällt jemanden eine Lösung ein, die das ganze auf ein bzw. zwei Querys veringert?

Grüße
Faux

annonyme 18. Apr 2006 15:13

Re: [SQL/PHP] Herausfinden ob Suchergebnis mit Ziffer beginn
 
case UPPER(SUBSTRING(serie,1,1))
when 'A' then 'A'
when 'B' then 'B'
.....
when '1' then '0-9'
.....
else 'sonderzeichen'
end AS chars



ist zwar nicht schön, würde aber auch gehen.

faux 18. Apr 2006 16:26

Re: [SQL/PHP] Herausfinden ob Suchergebnis mit Ziffer beginn
 
Wenn ich gewusst hätte, dass es in MySQL CASE, IF und sogar Schleifen gibt, wäre mir schon einige male geholfen gewesen.. :wall:
Danke!

Ich habs so gelöst:
SQL-Code:
SELECT
  CASE
    WHEN LOWER(SUBSTRING(serie,1,1)) BETWEEN 'a' AND 'z' THEN 'alpha'
    WHEN SUBSTRING(serie,1,1) BETWEEN '0' AND '9' THEN 'numeric'
    ELSE 'symbol'
  END AS chars
FROM page_series AS s, page_types AS t, page_publishers AS p
WHERE s.type = t.id
  AND p.id = s.publisher
  AND serie LIKE '%cat%'
GROUP BY chars
ORDER BY chars ASC
btw: Formatiert man das CASE in SQL so?

Danke nochmals!

Grüße
Faux


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz