[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
pagination nach abfrage über 2 tabellen - REDAXO Forum
Hallo,

Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.

Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt :-)
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/
aart
Beiträge: 97
Registriert: 24. Aug 2004, 22:11
Kontaktdaten: ICQ

pagination nach abfrage über 2 tabellen

5. Jan 2006, 00:03

moin,

ich habe ein formular mit suchfeldern und zwei tabellen mit adressdaten.
wenn ich nun eine abfrage mache, die sehr viele treffer enthaelt, moechte ich die 'pagination-function' aus dem guestbook-addon nutzen.

wenn ich mit dem formular nur eine tabelle abfrage, klappt es einwandfrei.
wenn ich mit dem formular beide tabellen mit JOIN abfrage, klappt dies (ohne pagination-function) auch einwandfrei.
aaaaber: wenn ich die komplett-abfrage mache, die eben auch die ergebnisse aus beiden tabellen darstellen soll und mit diesem ergebnis die zeilen zaehlen soll, gelingt es mir nicht :-(

nur eine tabelle abgefragt - funktioniert!

Code: Alles auswählen

function gbook_pagination($currentPage, $elementsPerPage, $paginationsPerPage)
{
  $qry = 'SELECT count(*) rowCount FROM rex_adressdaten'; 
    $sql = new sql();
    $data = $sql->get_array($qry);
:
:
}
da ich aber nicht mit count(*) alle datensaetze zaehlen will, sondern nur diejenigen, die die abfragebedingung erfuellen:

Code: Alles auswählen

 $qry = "
SELECT rex_adressdaten.adrnr,
  rex_adressdaten.name,
  rex_---,
  rex_adressdaten.ort,
  rex_geb_datum.ibez
FROM rex_adressdaten
LEFT JOIN rex_geb_datum
ON rex_adressdaten.id = rex_geb_datum.idnr
  WHERE rex_adressdaten.name like '%$name%' 
  AND rex_--- like '%$plz%' 
  AND rex_adressdaten.ort like '%$ort%' 
  AND rex_geb_daten.ibez like '%$ibez%' 
  ORDER BY name";
    $sql = new sql();
    $data = $sql->get_array($qry);
ich erhalte leider keine gueltigen werte fuer die pagination-function!?

fragen:
- wie kann ich die zeilen nach der abfrage mittels count() zaehlen?
bzw
- wie kann ich waehrend der abfrage ueber beide tabellen mit count(rex_adressdaten.name, rex_geb_datum.gebdatum)[???] die reihen zaehlen, die die bedingungen erfuellen?

hat jemand einen tipp?
gruss
aart

Benutzeravatar
Markus.Staab
Entwickler
Beiträge: 9634
Registriert: 29. Jan 2005, 15:50
Wohnort: Aschaffenburg/Germany
Kontaktdaten: ICQ Website

5. Jan 2006, 11:24

Hi aart,

wenn du Mysql >= 4.0 verwendest, kannst du es folgendermaßen machen:

Nur in SQL gesprochen:

Code: Alles auswählen

SELECT SQL_CALC_FOUND_ROWS
  rex_adressdaten.adrnr,
  rex_adressdaten.name,
  rex_---,
  rex_adressdaten.ort,
  rex_geb_datum.ibez
FROM rex_adressdaten
LEFT JOIN rex_geb_datum
ON rex_adressdaten.id = rex_geb_datum.idnr
  WHERE rex_adressdaten.name like '%$name%'
  AND rex_--- like '%$plz%'
  AND rex_adressdaten.ort like '%$ort%'
  AND rex_geb_daten.ibez like '%$ibez%'
  ORDER BY name;
SELECT FOUND_ROWS();
siehe:
http://dev.mysql.com/doc/refman/4.1/en/select.html
http://dev.mysql.com/doc/refman/4.1/en/ ... tions.html

Gruß,
Markus

aart
Beiträge: 97
Registriert: 24. Aug 2004, 22:11
Kontaktdaten: ICQ

5. Jan 2006, 18:09

hi kills,

danke fuer die antwort, aber mir fehlt noch der redaxo-teil ums testen zu koennen.

genauer:
im ersten beispiel fuer eine tabelle erhalte ich mit:

Code: Alles auswählen

$qry = 'SELECT count(*) rowCount FROM rex_adressdaten'
in der variable $rowCount den wert.

wie bekomme ich diesen bei deinem beispiel?

Code: Alles auswählen

SET @rowCount = FOUND_ROWS();
??????????
gruss
aart

Benutzeravatar
Markus.Staab
Entwickler
Beiträge: 9634
Registriert: 29. Jan 2005, 15:50
Wohnort: Aschaffenburg/Germany
Kontaktdaten: ICQ Website

5. Jan 2006, 19:32

Hi aart,

Code: Alles auswählen

$qry1 = "SELECT SQL_CALC_FOUND_ROWS
  rex_adressdaten.adrnr,
  rex_adressdaten.name,
  rex_---,
  rex_adressdaten.ort,
  rex_geb_datum.ibez
FROM rex_adressdaten
LEFT JOIN rex_geb_datum
ON rex_adressdaten.id = rex_geb_datum.idnr
  WHERE rex_adressdaten.name like '%$name%'
  AND rex_--- like '%$plz%'
  AND rex_adressdaten.ort like '%$ort%'
  AND rex_geb_daten.ibez like '%$ibez%'
  ORDER BY name";
$qry2 = "SELECT FOUND_ROWS()";

$sql1 = new sql();
$sql1->setQuery($qry1);

$sql2 = new sql();
$sql2->get_array($qry2);
so ungefähr.

Gruß,
Markus

aart
Beiträge: 97
Registriert: 24. Aug 2004, 22:11
Kontaktdaten: ICQ

6. Jan 2006, 16:42

hi kills,

die SQL_FUNC_FOUND_ROWS hat leider bei mir keine ergebnisee gebracht!?

ich habe mir nun anderweitig geholfen:
nach zaehlen der inhalte des arrays mit

Code: Alles auswählen

$anzahl = count($data);
habe ich nun eine variable

Code: Alles auswählen

$anzahl
, in der die zahl der treffer der abfrage ueber die zwei tabellen steht.

frage:
wie sage ich nun der variablen

Code: Alles auswählen

$rowCount
, die ja in der addon-guestbook-pagination funktion verwendet wird, dass sie den wert der variablen $anzahl uebernimmt???
urspruenglich bekommt sie ihren wert ja durch die sql-abfrage

Code: Alles auswählen

  $qry = 'SELECT count(*) rowCount FROM rex_adressdaten';
  $sql = new sql();
  $data = $sql->get_array($qry);
:
:
  $rowCount = $data[0]['rowCount'];
bei der abfrage ueber zwei tabellen kann ich ja mit rowCount

Code: Alles auswählen

"SELECT count(*) rowCount FROM rex_adressdaten LEFT JOIN rex_geb_datum ON .... WHERE name LIKE '%name%' ...";
nicht arbeiten, da er mir zwar die selektiven datensaetze anzeigt, die abfrage rowCount allerdings ueber alle datensaetze macht.

gruss
aart

Benutzeravatar
Markus.Staab
Entwickler
Beiträge: 9634
Registriert: 29. Jan 2005, 15:50
Wohnort: Aschaffenburg/Germany
Kontaktdaten: ICQ Website

7. Jan 2006, 13:38

Hi,

SQL_CALC_FOUND_ROWS

gibt selbst auch kein Ergenis.
Es veranlast den MySQL Server nur, die Zeilen zu zählen, und diese Zahl zu speichern. Die Zahl selbst erhälst du mit dem 2. SQL.

MySQL >= 4.0 brauchst du dazu!

teste das ganze doch einfach mal im phpMyAdmin

Gruß,
Markus

aart
Beiträge: 97
Registriert: 24. Aug 2004, 22:11
Kontaktdaten: ICQ

12. Jan 2006, 20:39

hi kills,

leider hat dies nicht geklappt, wie ich wollte :-(
allerdings habe ich nun eine andere loesung gefunden, die auch einwandfrei funktioniert!

trotzdem die frage, nach der "redaxo-konformen" umformatierung des untenstehenden codes, also nach dem schema:

Code: Alles auswählen

$qry = "
SELECT COUNT(*) 
FROM ...
LEFT JOIN ...
ON ...
  WHERE ... 
  AND ...
";

  $sql = new sql();
  $total = $sql->get_array($qry);

Code: Alles auswählen

// Feststellen der Anzahl der verfügbaren Datensätze.
$resultID = @mysql_query("
SELECT COUNT(*) 
FROM rex_adressen 
LEFT JOIN rex_gebdatum 
ON rex_adressen.id = rex_gebdatum.gebnr 
  WHERE rex_adressen.name1 like '%$name1%' 
  AND rex_adressen.ort like '%$ort%' 
");
$total    = @mysql_result($resultID,0);


// Datenbankabfrage ausführen.
$query    = "
SELECT rex_adressen.name1, rex_---, rex_adressen.ort, FROM rex_adressen 
LEFT JOIN rex_gebdatum 
ON rex_adressen.id = rex_gebdatum.gebnr 
  WHERE rex_adressen.name1 like '%$name1%' 
  AND rex_adressen.ort like '%$ort%' 
  AND ...
ORDER BY name1
" ." LIMIT ".$start.",".$limit;
$resultID = @mysql_query($query);


$anfang = $start + 1;
if ($anfang <= 0) {
$anfang = 0;
}

$ende = $start + $limit;
if ($ende >= $total) {
$ende = $total;
}


// Ergebnisse lesen und an den Client ausgeben
if ($total >=1) {
  while ($data = mysql_fetch_array($resultID))
  {
   ...
also die sql-abfragen und die zeile:

Code: Alles auswählen

  while ($data = mysql_fetch_array($resultID))
gruss
aart

Benutzeravatar
Markus.Staab
Entwickler
Beiträge: 9634
Registriert: 29. Jan 2005, 15:50
Wohnort: Aschaffenburg/Germany
Kontaktdaten: ICQ Website

12. Jan 2006, 22:26

Hi aart,

es gibt zig Module und Addons in denen du das nachschlagen kannst.

Gruß,
Markus

Zurück zu „Sonstiges“