php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
Alt 01.09.2008, 20:53  
Erfahrener Benutzer
 
Registriert seit: 07.06.2008
Beiträge: 992
PHP-Kenntnisse:
Fortgeschritten
Frank befindet sich auf einem aufstrebenden Ast
Frank eine Nachricht über ICQ schicken Frank eine Nachricht über MSN schicken Frank eine Nachricht über Yahoo! schicken
Standard [Erledigt] Limit auf Ergebnissumme mehrerer Tabellen

Hi,

Ich weiß, aus dem Titel wird man nicht besonders schlau, aber er beschreibt schon einigermaßen meine Problemstellung.

Irgendwie stehe ich gerade auf dem Schlauch und mir fällt nicht ein wie ich folgendes am besten löse (es sei gemerkt, dies findet noch alles auf theoretischer Ebene statt, die Datenbank/Tabellen gibt es noch nicht):

Gegeben sei eine Datenbank mit 4 Tabellen mit den Namen
  1. bug_reports
  2. feature_requests
  3. other_usercontributions
  4. official_news
Zur Vereinfachung sei nun angenommen, alle 4 Tabellen haben die Folgende gleiche Struktur (Felder)
  • Id (int, primary key, auto_increment)
  • Title (varchar 255)
  • Timestamp (int)
Nun gibt es auf der Seite eine art "Hot News" Bereich. Hier sollen die 5 neuesten Beiträge stehen, jedoch nicht aus einer Tabelle sondern aus allen 4 Tabellen. Das bedeutet ich müsste alle Einträge aus allen 4 Tabellen auswählen, sie nach dem Timestamp (DESC) Ordnen und dann mit Limit die Ausgabe auf die "obersten" 5 Ergebnisse einschränken.

Das ist mir soweit ja schon klar und bei einer Tabelle ist das auch kein Problem
Code:
SELECT `Id`, `Title` FROM `official_news` ORDER BY `Timestamp` DESC LIMIT 5
Doch nun komme ich nicht mehr weiter, wie mache ich diese Abfrage von mehr als einer Tabelle?
Ich könnte nun natürlich diese Abfrage an alle Tabellen senden und die Ergebnisse dann nocheinmal manuell aussortieren, doch ich möchte das eigentlich lieber direkt in der Abfrage erledigt haben.

Ich hoffe das war einigermaßen verständlich, ansonsten einfach "drauflosfragen" ^^

Danke und LG
__________________
Frank ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 01.09.2008, 21:35  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.172
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard

Hallo!

Left Join denke ich wäre da dein dein Freund!
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de
litterauspirna ist offline   Mit Zitat antworten
Alt 01.09.2008, 21:57  
Erfahrener Benutzer
 
Registriert seit: 07.06.2008
Beiträge: 992
PHP-Kenntnisse:
Fortgeschritten
Frank befindet sich auf einem aufstrebenden Ast
Frank eine Nachricht über ICQ schicken Frank eine Nachricht über MSN schicken Frank eine Nachricht über Yahoo! schicken
Standard

Hi,
vielen Dank für den Tipp, habe mich mal etwas in Left join hereingelesen und die mal 2 Tabellen von den 4 Tabellen erstellt mit 3 Testdatensätzen:

Code:
CREATE TABLE bug_reports (
  id bigint(20) NOT NULL auto_increment,
  `timestamp` bigint(20) NOT NULL,
  title varchar(255) collate utf8_unicode_ci NOT NULL,
  author varchar(100) collate utf8_unicode_ci NOT NULL,
  ip varchar(15) collate utf8_unicode_ci NOT NULL,
  `status` int(1) NOT NULL,
  `text` text collate utf8_unicode_ci NOT NULL,
  note text collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (id)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;

INSERT INTO bug_reports (id, timestamp, title, author, ip, status, text, note) VALUES(1, 1220298285, 'Bug at calling timed jobs', 'Ch3ck3r', '127.0.0.1', 0, 'I found a bug at calling timed jobs.\r\nIt occurs a timed action to a second is called more than one time in this second.', 'yet unreplied');

INSERT INTO bug_reports (id, timestamp, title, author, ip, status, text, note) VALUES(2, 1220298503, 'Color parser error', 'Ch3ck3r', '127.0.0.1', 1, 'There is a mistake in color parser class for Trackmania color codes, control $o does not get removed or interpreted.', 'Bug is fixed in next version.');




CREATE TABLE official_news (
  id bigint(20) NOT NULL auto_increment,
  `timestamp` bigint(20) NOT NULL,
  title varchar(255) collate utf8_unicode_ci NOT NULL,
  author varchar(100) collate utf8_unicode_ci NOT NULL,
  `text` text collate utf8_unicode_ci NOT NULL,
  `language` varchar(2) collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (id)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;

INSERT INTO official_news (id, timestamp, title, author, text, language) VALUES(1, 1220298367, 'Site goes online', 'Ch3ck3r', 'The website of SRS (Secure Remote System) has been released to the world''s wide public.', 'en');
Habe nun in MySQL versucht per Join die 3 Datensätze in der Richtigen Reihenfolge abzufragen
Code:
SELECT `bug`.`id`, `bug`.`title`, `news`.`id`, `news`.`title`
FROM `bug_reports` as `bug` 
LEFT JOIN `official_news` as `news`
ON ????
ORDER BY `bug`.`timestamp` AND `news`.`timestamp` DESC 
Es scheitert hier natürlich an ein paar stellen, ich habe sie Fett markiert.
Worauf soll ich die Tabelle joinen und wie soll ich sie dann sortieren.
Außerdem wie kann ich später noch erkennen aus welcher Tabelle der Datensatz stammte (obwohl das nicht unbedingt wichtig ist)
__________________
Frank ist offline   Mit Zitat antworten
Alt 01.09.2008, 22:05  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.172
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard

Du musst den Feldern die du ausliest auch sogenannte indices geben!

z.B. so!

PHP-Code:
$sqlbefehl ="
                Select
                      c.id,
                      c.name,
                      d.c_id,
                      d.datei_name
                From
                      kategorien c
                Left Join
                      dateien d
                ON
                      (c.id = d.c_id)
                "

Mit dem c. und d. vergibst du den indice jeder Tabelle!
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de
litterauspirna ist offline   Mit Zitat antworten
Alt 01.09.2008, 22:10  
Erfahrener Benutzer
 
Registriert seit: 07.06.2008
Beiträge: 992
PHP-Kenntnisse:
Fortgeschritten
Frank befindet sich auf einem aufstrebenden Ast
Frank eine Nachricht über ICQ schicken Frank eine Nachricht über MSN schicken Frank eine Nachricht über Yahoo! schicken
Standard

Ja soweit so gut, aber du hast das jetzt über die ids gejoint.
Die Ids der einen Tabelle haben allerdings nichts mit den Ids der anderen Tabelle zu tun.

Stell dir vor du hast 2 Verschiedene Gästebücher, die nichts miteinander zu tun haben (keine Beziehungen in der Datenbank).

Nun komm ich und will die neusten 5 Einträge ausgeben, aber nicht Von Gästebuch A oder B sondern von beiden gleichzeitig, sodass das Ergebnis etwa so ist:
  • GB A: Eintrag 503, Zeit: 10
  • GB B: Eintrag 4, Zeit: 8
  • GB B: Eintrag 3, Zeit: 7
  • GB A: Eintrag 502, Zeit: 6
  • GB B: Eintrag 501, Zeit: 1
Ich habe jetzt die Zeit zum vereinfachen auf simple Zahlen reduziert
__________________
Frank ist offline   Mit Zitat antworten
Alt 01.09.2008, 22:13  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.172
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard

Nunja für das Problem gibts doch Prefixe,also die Dinger die es möglich machen ein Script mehrmals in einer DB zu verwenden!

Das war auch nur ein Musterbeispiel und keine Lösung! Das Prinzip des Left Joins solltest du anhand des Beispiels heraussehen können!
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de
litterauspirna ist offline   Mit Zitat antworten
Alt 01.09.2008, 22:19  
Erfahrener Benutzer
 
Registriert seit: 07.06.2008
Beiträge: 992
PHP-Kenntnisse:
Fortgeschritten
Frank befindet sich auf einem aufstrebenden Ast
Frank eine Nachricht über ICQ schicken Frank eine Nachricht über MSN schicken Frank eine Nachricht über Yahoo! schicken
Standard

Ja, ich weiß wie Left Join funktioniert, aber dafür brauchst du immer Felder die zu Verknüpfen sind (ON Bedingung). Diese Felder existieren hier ja nicht. Du kannst keine ON Bedingung erschaffen, und ohne geht ein JOIN nicht.

Außerdem joined JOIN verschiedene Felder zu einer Zeile zusammen
also symbolisch

Code:
------------------------------------------------------------------------
FELD 1 aus TBL 1, FELD 2 aus TBL 1, FELD 1 aus TBL 2, FELD 2 aus TBL 2
------------------------------------------------------------------------
------------------------------------------------------------------------
FELD 1 aus TBL 1, FELD 2 aus TBL 1, FELD 1 aus TBL 2, FELD 2 aus TBL 2
------------------------------------------------------------------------
------------------------------------------------------------------------
FELD 1 aus TBL 1, FELD 2 aus TBL 1, FELD 1 aus TBL 2, FELD 2 aus TBL 2
------------------------------------------------------------------------
Das ist bei diesem Problem ja falsch, ich bräuchte eher so eine art "Join"

Code:
-------------------------------------
FELD 1 aus TBL 1, FELD 2 aus TBL 1
-------------------------------------
-------------------------------------
FELD 1 aus TBL 2, FELD 2 aus TBL 2
-------------------------------------
-------------------------------------
FELD 1 aus TBL 1, FELD 2 aus TBL 1
-------------------------------------
__________________
Frank ist offline   Mit Zitat antworten
Alt 02.09.2008, 09:10  
Benutzer
 
Registriert seit: 02.09.2008
Beiträge: 38
Fumpi befindet sich auf einem aufstrebenden Ast
Standard

Ich denke, JOIN ist hier der falsche Ansatz. Wie Frank schon schrieb, müsste es dafür ein Feld in den Tabellen geben, welches man miteinander verknüpfen könnte. Und das gibt es hier nicht.

Ich würde es mit Unterabfragen versuchen.
MySQL :: MySQL 5.1 Referenzhandbuch :: 13.2.8.8 Unterabfragen in der FROM-Klausel
13.2.8.8. Unterabfragen in der FROM-Klausel

Also für jede der 4 Tabellen eine eigene Unterabfrage mit LIMIT und ORDER BY und von dieser Ergebnissmenge dann wieder durch LIMIT und ORDER BY das endgültige Ergebnis ermitteln.
Fumpi ist offline   Mit Zitat antworten
Alt 02.09.2008, 11:33  
Erfahrener Benutzer
 
Registriert seit: 05.04.2005
Beiträge: 1.333
Freeaak ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von litterauspirna Beitrag anzeigen
Du musst den Feldern die du ausliest auch sogenannte indices geben!
ich glaube, du meinst aliases ...

@te: wie wäre es mit SELECT UNION?
__________________
"Wenn du nicht weißt, was du tust: Machs mit Eleganz!"

(Murphy's Gesetze)
Freeaak ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] MySQL-Abfrage mit LIMIT geht nicht PhilCGN PHP Tipps 2008 16 30.05.2008 15:39
Tabellen für Vokabeltrainer anlegen... anonym01 PHP Tipps 2008 9 03.03.2008 21:18
PHP Array in MYSQL Tabellen schreiben Matt Datenbanken 1 26.02.2008 19:43
5 tabellen miteinander verknüpfen. miwo Datenbanken 2 22.09.2007 11:17
Tabellen Limit? thefaxx Datenbanken 2 02.10.2006 17:06
Join-Abfrage über mehrere Tabellen sinai Datenbanken 3 04.02.2006 13:05
einträge aus 2 tabellen sortieren Tschuu Datenbanken 11 20.12.2005 08:21
Abfrage mehrerer Tabellen per PHP (Code vereinfachen) PHP Tipps 2007 4 18.12.2005 12:34
[Erledigt] abfrage mehrere tabellen PHP Tipps 2005-2 3 31.10.2005 21:57
Befehlsoptimierung faux Datenbanken 4 31.05.2005 19:11
Feldname bei LIMIT setzen? Datenbanken 8 30.11.2004 18:52
[Erledigt] Selectanfrage an eine Datenbank,aber aus mehreren Tabellen Datenbanken 2 26.10.2004 07:23
Abfrage zweier Tabellen funzt net richtig Datenbanken 1 17.09.2004 12:53
LIMIT(?) Fehler Schaelle Datenbanken 0 28.08.2004 14:11
[Erledigt] fulltext suche priorität von tabellen setzen Datenbanken 1 09.08.2004 15:26

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php tabelle limit, sortiert tabelle limit, limit gästebuchs html

Alle Zeitangaben in WEZ +2. Es ist jetzt 02:23 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum