 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, Deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
26.11.2002, 17:10
|
#1
|
|
TP-Specialist
Registriert seit: Apr 2002
Ort: 743, evergreen terrace
|
zwei abfragen miteinander verknuepfen
hi leute,
gibt es eine moeglichkeit, zwei abfragen miteinander zu verkuepfen?
("SELECT * FROM table1,table2,table3 WHERE merkmal1 LIKE '%$surch'") AND ("SELECT * FROM other_table WHERE merkmal2 LIKE '%$surch'")
sowas in der art nur, dass das ding hier nicht hinhaut.
eine andere moeglichkeit waere vielleicht, zwei getrennte abfragen in zwei variablen zu packen, diese zu mischen, zu sortieren und dann auszugeben.
koennte mir da vielleicht jemand beim code etwas auf die spruenge helfen?
gruss,
theo
|
|
|
26.11.2002, 17:46
|
#2
|
|
TP-Specialist
Registriert seit: Jan 2002
Ort: TP/Dynamik
|
www.sqlcourse.com und http://www.sqlcourse2.com.
arbeite dich durch die wirklich guten sql - grundlagentutorials durch.
wenn du dann noch fragen hast, dann melde dich.
__________________
Gehelft? Hier kannst du dich bedanken.
mike
|
|
|
26.11.2002, 19:36
|
#3
|
|
TP-Specialist
Registriert seit: Apr 2002
Ort: 743, evergreen terrace
|
also ...
in den tut´s habe ich nicht bahnbrechend neues gefunden oder gelernt.
es scheitert ja schon daran, dass er bei der abfrage schon scheitert, wenn ich ihm eine zweite tabelle zum durchsuchen hinzufuege. da haben auch die tut´s nix aendern koennen. er macht´s eben einfach nicht.
theo
|
|
|
26.11.2002, 20:05
|
#4
|
|
TP-Specialist
Registriert seit: Jan 2002
Ort: TP/Dynamik
|
wow. bist ja in eiltempo durch die tuts durchgerast.
wenn du dann auch noch alle themen mit den aufgaben durchgespielt hast und diese auch verstanden hast. respekt.
nur wundert es mich dann, warum du nicht 1+1 zusammenzählst und die aufgabe 10 in http://sqlcourse2.com/joins.html
mit deinem query vergleichst und sebst rausfindest warum deine query nicht funktionieren kann.
basics - theo - basics.
__________________
Gehelft? Hier kannst du dich bedanken.
mike
|
|
|
26.11.2002, 20:25
|
#5
|
|
TP-Specialist
Registriert seit: Apr 2002
Ort: 743, evergreen terrace
|
vielleicht sitze ich heute auch schon zu lange an den sachen ...
kann sein. langsam fangen die buchstaben und zahlen an, ein eigenleben zu fuehren. aber soweit kriege ich das noch zusammen:
die abfrage, so simpel sie jetzt auch ist, klappt einfach nicht.
SELECT * FROM table1, table2 WHERE kriterium LIKE '%$surch%'
die variable $surch hat auf jeden fall einen wert. hab das schon mit ´nem echo gecheckt. solange es nur eine tabelle ist, klappt es. kommt eine zweite dazu, ist es aus. wenn das schon nicht geht ... !?
aber selbst in den tut´s steht es so drin und haut doch nicht hin, basics hin oder her.
gruss,
theo
Geändert von theo (26.11.2002 um 20:31 Uhr).
|
|
|
26.11.2002, 20:34
|
#6
|
|
TP-Specialist
Registriert seit: Jan 2002
Ort: TP/Dynamik
|
die seite hört aber NICHT beim ersten codebeispiel auf - die kann man scrollen.
wenn du weitergelesen hättest wärst du wahrscheinlich bei dem punkt angekommen, der die verknüpfung von normalisierten tabellen beschreibt.
---
Notice how each of the tables have a common "cusomer_number" column. This column, which contains the unique customer number will be used to JOIN the two tables. Using the two new tables, let's say you would like to select the customer's name, and items they've purchased. Here is an example of a join statement to accomplish this:
SELECT customer_info.firstname, customer_info.lastname, purchases.item
FROM customer_info, purchases
WHERE customer_info.customer_number = purchases.customer_number;
This particular "Join" is known as an "Inner Join" or "Equijoin". This is the most common type of "Join" that you will see or use.
---
weiters solltest du bedenken, dass alle felder die in den beiden tabellen gleich heissen und ausgegeben werden sollen den tabellennamen davor benötigen. das gilt auch für die whereklausel.
__________________
Gehelft? Hier kannst du dich bedanken.
mike
|
|
|
27.11.2002, 12:51
|
#7
|
|
TP-Specialist
Registriert seit: Apr 2002
Ort: 743, evergreen terrace
|
zweite runde
wie es aussieht, ist es nicht immer ganz leicht. ich hab mir die sachen nochmal in ruhe angesehen und meine abfragen umgestellt. aber es waere ja langweilig, wenn es nicht schon wieder schwierigkeiten gaebe.
die abfragen sahen so:
SELECT table1.colname,table2.colname FROM table1, table2 WHERE table1.colname LIKE '%$surch%' OR table2.colname LIKE '%$surch%'
und so:
SELECT table1.colname,table2.colname FROM table1 INNER JOIN table2 ON table1.colname LIKE '%$surch%' OR table2.colname LIKE '%$surch%'
aus.
erstaunlicherweise liefern sie bei einer abfrage, die lediglich ein ergebnis ergeben sollte, eine anzahl von 47 angaben. und zwar bei beiden abfrage und unterschiedlichen suchbegriffen. es sind immer 47. warum?
gruss,
theo
Geändert von theo (27.11.2002 um 13:40 Uhr).
|
|
|
27.11.2002, 14:04
|
#8
|
|
TP-Specialist
Registriert seit: Jan 2002
Ort: TP/Dynamik
|
deine statements sind semantisch nicht richtig, da du die tabellen nicht miteinander in beziehung gestellt hast (primärschlüssel - fremdschlüssel).
somit wirst du eine vielzahl von datesätzen bekommen, da sich die abfrage 'auskreuzt' = jeder datensatz der ersten tabelle mit jedem ds der zweiten wird in beziehung gestellt und ausgegeben.
prizipiell solltest du dir mal klar werden wozu man joins verwendet:
tabelle 1
rubrikID|rubrikname
tabelle 2
artikelID|artikelname|rubrikID
du siehst hier zwei tabellen, die einen normalisierten bezug zueinander über das feld rubrikID haben (t1=primärschlüssel, t2=sekundärschlüssel) und dadurch eindeutig zuzuordnen sind.
nun verwendet man joins oder auch views genannt um hier eine einen gesammelten datensatz zu erhalten:
z.b. alle artikelnamen und die dazugehörigen rubriknamen
artikelID|artikelname|rubrikname
dies erhältst du indem du wie in kaptitel 10 beschrieben vorgehst.
natürlich ist das nur ein ganz kleiner abriss von möglichkeiten und anwendungsgebieten von sql.
haben deine tabellen keinen eindeutigen bezug zueinander, wirst du diese nicht joinen können. da ich dein datenmodell jedoch nicht kenne, und du diesbezüglich auch keine angaben gemacht hast, denke ich mal, dass dem nicht der fall ist.
__________________
Gehelft? Hier kannst du dich bedanken.
mike
|
|
|
28.11.2002, 11:26
|
#9
|
|
TP-Specialist
Registriert seit: Apr 2002
Ort: 743, evergreen terrace
|
manchmal ist es vielleicht wirklich nicht verkehrt, ...
wenn man sich selbst durch alles durchquaehlen muss.
ok, ich habe jetzt die abfragen alle durchgearbeitet und bin zu folgendem ergebnis gekommen:
SELECT DISTINCT table1.spalte1,table1.spalte2,table2.spalte FROM table1,table2 WHERE (table1.kat_id = table2.kat_id) AND (spalte LIKE '%$surch%' OR spalte1 LIKE '%$surch%' OR spalte2 LIKE '%$surch%')
eine testabfrage sollte insgesamt 6 ergebnisse liefern, die alle aus der der tabelle1 stammen sollen (3 aus der spalte1 und 3 aus spalte2).
die tabelle2 enthaelt 47 zeilen. das ergebnis der abfrage sind 141 datensaetze (47 x 3), bei denen er alle moeglichen kombinationen der daten untereinander ausgibt.
fuer mich scheint er die daten zu mischen und dann erst auszugeben. er sollte es doch aber umgekehrt tun?! wo hab ich hier einen fehler in der abfrage gemacht?
gruss,
theo
|
|
|
28.11.2002, 12:14
|
#10
|
|
TP-Specialist
Registriert seit: Jan 2002
Ort: TP/Dynamik
|
Zitat:
|
wenn man sich selbst durch alles durchquaehlen muss.
|
...der weg ist das ziel, theo. ich nenn sowas lernen. nicht durchquälen.
nochmal meine frage:
sind deine beiden tablellen voneinander abhängig?
oder sind das zwei von deinen sechs kathegorie-zaubertabellen?
wenn dem so ist, wirf den join weg und mach zwei queryies.
zum mitschreiben: ein join ist dann sinnvoll wenn ich eine teilmenge von feldern aus 2 oder mehr zueinander in beziehung stehenden tabellen bekommen will.
hab ich keine beziehung zwischen den tabellen, bringt der jonin nur müll. = 141 datensätze
__________________
Gehelft? Hier kannst du dich bedanken.
mike
|
|
|
28.11.2002, 13:31
|
#11
|
|
TP-Specialist
Registriert seit: Apr 2002
Ort: 743, evergreen terrace
|
meine sechs zaubertabellen ...
habe ich zu einer zusammengelegt (was ich wegen der uebersichtlichkeit immer vermeiden wollte). jetzt stimmen wirklich alle relationen innerhalb der db.
tabelle0 teilt die gesamtdaten in sechs verschiedene hauptkategorien auf (schluessel: kat_id)
denen werden in tabelle2 entsprechende subkategorien zugeordnet (schluessel: kat_id und sub_id)
ttabelle1 enthaelt alle datensaetze, die sich ueber die sub_id und kat_id (enthaelt noch eine eigene id, um die datensaetze eindeutig zuzuordnen)
ich nehme daher einfach mal an, dass die db einen logischen und funktional richtigen aufbau hat.
ich bin auch extra nochmal die schluesselfelder alle durchgegangen. der fehler steckt meiner ansicht nach in der syntax vom select
|
|
|
28.11.2002, 13:45
|
#12
|
|
TP-Specialist
Registriert seit: Jan 2002
Ort: TP/Dynamik
|
ok.
wenn du als schlüssel für die tab1 und tab2 einen zusammengesetzten schlüssel verwendest, musst du diesen auch in deinem select entsprechend anführen.
wobei ich an deiner stelle den doppelschlüssel generell überdenken würde, da er imho nicht benötigt wird. ein ds in tab1 wird eindeutig durch die subID aus tab2 zugeordnet - soweit ich das verstehe.
also:
tab0:
katID| hauptkategoriename
tab2:
subID|katID|unterkategoriename
eine hauptkategorie hat mehrere sub und eine sub passt genau zu einer hauptkategorie= 1:n beziehung.
tab1:
artikelID|subID|aritkelname
eine subkategorie hat mehere artikel und ein artikel passt genau zu einer subkategorie = ebenfalls 1:n beziehung. das macht dann auch die wartung einfacher. wobei ich dir da eine rudimentäre eingabemaske für die pflege nahelegen möchte. skills dazu sowas zu machen solltes du bereits haben.
also:
- entweder doppelschlüssel in die query einbauen
- oder tabellen vereinfachen (mein tip)
tipp noch zum select: nimm auch bei der where klausel die tabellennamen mit.
__________________
Gehelft? Hier kannst du dich bedanken.
mike
|
|
|
28.11.2002, 14:09
|
#13
|
|
TP-Junior
Registriert seit: Nov 2002
|
aaalso moin erstmal
tabelle0 (hauptkategorien)
tabelle2 (subkategorien)
tabelle1 (datensaetze)
schluessel sehen so aus?
tabelle0 (kat_id(prim key), kat_name)
tabelle2 (subkat_id (prim key), subkat_name, oberkat_nr(fremdschluessel))
tabelle1 (datensatz, kat_nr(fremdschluessel), subkat_nr(fremdschluessel))
also join ueber alles
SELECT daten.wasduwillst
FROM tabelle1, tabelle2, tabelle0
WHERE //erster join daten mit kategorie
tabelle1.kat_nr = tabelle0.kat_id
AND //zweiter join mit subkats
tabelle1.subkat_nr = tabelle2.subkat_id
//und nun einschraenkungen
AND ( x LIKE 'suchdings' OR y LIKE 'suchdings');
was meint ihr dazu?
sind vielleicht eher die prim- fremdschluesselbeziehungen "schief"?
aber die chackt ja mysql eh' nicht richtig ab
soweit erstmal
tschoe
"der neue"
|
|
|
28.11.2002, 14:16
|
#14
|
|
TP-Junior
Registriert seit: Nov 2002
|
nochmal ich... wollte mal ein bildchen meines gemeinten erm's mitgeben. damit kann man am leichtesten den ueberblick behalten finde ich
|
|
|
28.11.2002, 14:28
|
#15
|
|
TP-Junior
Registriert seit: Nov 2002
|
nun meine frage, wie ist das mit der referenzierung von fremdschluesseln in mysql?
die werden ja angeblich nicht geprueft, muss man sie dann dennoch als solche ausweisen?
oder macht man das nur fuer kommende versionen, die das dann koennen?
|
|
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
Thema durchsuchen |
|
|
|
| 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.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 20:59 Uhr.
|
 |