mysql abfrage
richard
- datenbank
hallo!
ich versuche verzweifelt eine besondere abfrage zu basteln, aber ich durchschaue diese Left- und Right-JOIN Regeln einfach nicht. Kennt einer von euch einen link, wo das ganze auch für langsame erklärt wird?
kompliziert is' a nicht:
ich habe eine tabelle 'personen'
und ich habe drei tabellen 'sack' (sack1, sack2, sack3)
ich möchte jetzt alle Reihen von Sack1-3 in denenen im feld 'name' das gleiche steht wie im feld 'name' der tabelle 'personen', und zwar in der reihe dessen feld 'status' "gesucht" enthält.
weiß jemand den zauberspruch um die gesuchten namen aus den säcken zu
fischen?
hoffe es kann da wer helfen, wäre eine sehr große hilfe!
danke,
richard
Hallo,
wieso willst Du das mit einem OUTER JOIN machen, willst Du alle Daten behalten, also auch die, die keinen Namen identisch haben?
Ansonsten hilft natürlich der NATURAL JOIN.
Grüße, Matthias
willst Du alle Daten behalten, also auch die, die keinen Namen identisch haben?
behalten will ich auf jeden fall alle daten! keine des tabellen soll verändert werden. ich brauche nur eine ausgabe der gesuchten reihen oder eventuell das schreiben des ergebnis in eine neue tabelle.
verändert JOIN die tabellen, die durchsucht werden?
yo,
Ansonsten hilft natürlich der NATURAL JOIN.
du meinst einen inner join. ein natural join kennzeichnet sich dadurch, dass die spaltennamen der betroffenen tabellen, über den der join geht, gleich sind.
Ilja
yo,
ich habe eine tabelle 'personen'
und ich habe drei tabellen 'sack' (sack1, sack2, sack3)
die frage ist, ob man nicht diese drei tabellen eventuell zu einer zusammenführen könnte. das würde vieles erleichtern. oder mit anderen worten, was genau bilden den diese drei tabellen ab ?
ich möchte jetzt alle Reihen von Sack1-3 in denenen im feld 'name' das gleiche steht wie im feld 'name' der tabelle 'personen', und zwar in der reihe dessen feld 'status' "gesucht" enthält.
ich würde nicht das wort reihen benutzen, sondern man spricht in aller regel von datensätzen. klingt ein wenig kleinlich, hilft aber ungemein beim austausch von informationen und erleichtert somit die hilfestellung.
ok, nun aber zu deinem problem. letztlich wäre erst einmal interessant, ob man deine drei tabellen nicht zu einer zusammenfassen kann. und wenn nicht, dann hört sich das für mich wie drei abfragen eines inner joins an, die mit union verbunden werden. klingt erst einmal kompliziert, ist es aber nicht. ich gebe dir mal den ungefähren aufbau einer dieser drei abfragen.
SELECT spalte1, spalte2...
FROM sack1, personen
WHERE sack1.name = personen.name
AND personen.status = 'gesucht'
wobei ich vorrausgesetzt habe, dass die spalte status zu der tabelle personen gehört und sicherlich die gleichen namen mehrfach in unterschiedlichen datensäötzen vorkommen können.
Ilja
hallo,
zunächst vielen dank llya für deine zeilen!
ich freu mich.
ich würde nicht das wort reihen benutzen, sondern man spricht in aller regel von datensätzen. klingt ein wenig kleinlich, hilft aber ungemein beim austausch von informationen und erleichtert somit die hilfestellung.
danke!
die frage ist, ob man nicht diese drei tabellen eventuell zu einer zusammenführen könnte. das würde vieles erleichtern.
ich hab gleich die union syntax angesehen, wird aber noch einen moment dauern, bis ich den ganz verstanden hab. der schreibt das ergebnis ja nicht irgendwohin, sondern speichert alle select's und gibt sie gemainsam aus, oder?
SELECT spalte1, spalte2...
FROM sack1, personen
WHERE sack1.name = personen.name
AND personen.status = 'gesucht'
danke auch hierfür. mein ansatz wäre gewesen eine abfrage aus personen zu machen, den zu vergleichenden datensatz zwischenzuspeichern und dann in die 'säcke' suchen zu gehen. aber dann schenkt man man ja die fähigkeiten der datenbank her..
vom variablensalat ganz zu schweigen.
oder mit anderen worten, was genau bilden den diese drei tabellen ab ?
mein beispiel war vereinfacht aber der eigentliche inhalt dürfte für 'insider' nicht schwer nachvollziehbar sein:
eine fragebogendatenbank. 30 fragen mit jeweils 2 bis 5 unterfragen (sprich dazugehörigen datensätzen in jeweils einer tabelle)
meine 'säcke' sind also 'daten_frage1', 'daten_frage2',.. usw.
kurzprinzip: jeder der ausfüllt hat von vornherein eine id. ein ausgefüllter fragebogen (30Fragen) kennzeichnet sich durch die gleiche phpsessionid. ist die session gekillt oder abgelaufen kann der fragebogen nochmal ausgefüllt werden. (=>gleiche userid, andere sessionid)
eine solche tabelle besteht aus ->phpsessionid, ->userid, und unterschiedliche vielen zusätzlichen feldern die jeweils eine ja/nein-, 1,2,3oder4-, oder textfeld_data- Information enthält.
die personentabelle heißt eigentlich 'sessions'. bekommt einen datansatz mit ->phpsessionid, userid, session_startzeit und einer Information ob die session regulär beendet worden ist.
sicher kein ideales konzept und dass es teilweise redundant ist fällt mir auch auf aber jetzt muss ich die daten zu den fragen wieder herausdröseln. die sessions-tabelle sagt mir wonach ich suchen muss. user mit der id 1 z.b. kommt mit 3 verschiedenen phpsessionid's in der sessions-tabelle vor. ich muss die erste nehmen, und nun aus allen daten_... tabellen den dazugehörigen datensatz holen (am besten mit SELECT *, weil es unterschiedlich viele felder gibt)(und wenn eine session abgebrochen wurde gibt es vielleicht nicht in jeder tabelle einen datansatz dazu).
ich müsste nur so einen session-satz (sowei vollständig)als z.b. csv-daten bekommen, dann wär ich schon glücklich.
ok, nun aber zu deinem problem. letztlich wäre erst einmal interessant, ob man deine drei tabellen nicht zu einer zusammenfassen kann.
ich habe ursprünglich deshalb für jede frage eine tabelle genommen, damit es nicht so lange dauert einen datensatz zu suchen und weil nur die daten jeweils einer frage in den selben feldern speichern lassen.
aber wenn ein nachträgliches zusammenfassen in der abfrage hilft..
und wenn nicht, dann hört sich das für mich wie drei abfragen eines inner joins an, die mit union verbunden werden.
wobei ich vorrausgesetzt habe, dass die spalte status zu der tabelle personen gehört und sicherlich die gleichen namen mehrfach in unterschiedlichen datensäötzen vorkommen können.
ja und nein. in einer daten_..tabelle gibt es bestimmt immer nur einen einzigen datensatz mit einer sessionid.
ich zerbrech mir mal weiter den kopf. aber über komentare (am besten gut gemeinte) oder sogar ratschläge oder kritik freue ich mich.
lg
richard
yo,
ich hab gleich die union syntax angesehen, wird aber noch einen moment dauern, bis ich den ganz verstanden hab. der schreibt das ergebnis ja nicht irgendwohin, sondern speichert alle select's und gibt sie gemainsam aus, oder?
der union macht in prinzip folgendes. er nimmt die ergebnistabellen der jeweiligen abfragen und fügt sie zu einer zusammen. wird quasi einfch nur "zusammengeklebt", wobei beim UNION doppelte datensäze rausgeschmissen werden im gegensatz zum UNION ALL.
eine fragebogendatenbank. 30 fragen mit jeweils 2 bis 5 unterfragen (sprich dazugehörigen datensätzen in jeweils einer tabelle)
daraus würde ich versuchen eine einzige tabelle zu machen und auch die personen tabelle mit zu integrieren. für die antwort jeder frage oder einer unterabfrage würde dann in einer spalte abgebildet werden.
kurzprinzip: jeder der ausfüllt hat von vornherein eine id. ein ausgefüllter fragebogen (30Fragen) kennzeichnet sich durch die gleiche phpsessionid. ist die session gekillt oder abgelaufen kann der fragebogen nochmal ausgefüllt werden. (=>gleiche userid, andere sessionid)
das muss meiner meinung nach gar nicht in die datenbank mit rein. erst wenn alle fragen beantwortet sind und die sessionid noch gültig ist, schreibst du in die datenbank. ich gehe mal davon aus, dass die user sowieso anonym sind, sprich ihre daten nicht gespeichert werden. also bevor nicht alles ok ist, wird die datenbank auch nicht in anspruch genommen. ist alles ok, so musst du nur einen datensatz in einer tabelle schreiben, um alle anworten der fragen abbilden zu können.
ich habe ursprünglich deshalb für jede frage eine tabelle genommen, damit es nicht so lange dauert einen datensatz zu suchen und weil nur die daten jeweils einer frage in den selben feldern speichern lassen.
ganz schlechter ansatz und bezogen auf die geschwindigkeit einfach mal falsch.
aber wenn ein nachträgliches zusammenfassen in der abfrage hilft..
das sollte es ungemein.
Ilja
hallo,
der union macht in prinzip folgendes
der wird noch mein freund...
eine fragebogendatenbank. 30 fragen mit jeweils 2 bis 5 unterfragen
daraus würde ich versuchen eine einzige tabelle zu machen und auch die personen tabelle mit zu integrieren. für die antwort jeder frage oder einer unterabfrage würde dann in einer spalte abgebildet werden.
das wird es ja schon. Frage15 (inhalt geändert) "Was denkst du über php?
das muss meiner meinung nach gar nicht in die datenbank mit rein. erst wenn alle fragen beantwortet sind und die sessionid noch gültig ist, schreibst du in die datenbank. ich gehe mal davon aus, dass die user sowieso anonym sind, sprich ihre daten nicht gespeichert werden. also bevor nicht alles ok ist, wird die datenbank auch nicht in anspruch genommen. ist alles ok, so musst du nur einen datensatz in einer tabelle schreiben, um alle anworten der fragen abbilden zu können.
da gebe ich dir normalerweise absolut recht! ABer in diesem fall sind die ansprechpersonen bekannt und identifiziert. und, es muss jede frage sofort gespeichert werden (vorgabe). damit auch bei abbruch die bisherig beantworteten fragen verfügbar sind. klingt dumm, ist es auch, kannnichtsdafür.
ich habe ursprünglich deshalb für jede frage eine tabelle genommen, damit es nicht so lange dauert einen datensatz zu suchen und weil nur die daten jeweils einer frage in den selben feldern speichern lassen.
da hab ich mich schlecht ausgedrückt. ich war einfach der meinung ich hätte weniger scherereien, wenn ich pro gezeigter frage auf eine eigene tabelle zugreife. und dass ich nicht extra in einer anderen tabelle speichern müsste wieviele felder relevant sind. sondern mit mysql describe oder ähnlichem einfach die feldanzahl abfrage, die ersten mit id, usw abziehe und die sind dann meine datenfelder.
dumm gedacht, jetzt würd ichs auch anders machen aber alles nochmal zu coden für die 150 ansprechpersonen solls auch nicht sein müssen.
ganz schlechter ansatz und bezogen auf die geschwindigkeit einfach mal falsch.
verstanden.
aber wenn ein nachträgliches zusammenfassen in der abfrage hilft..
das sollte es ungemein.
wird gleich mein nächster versuch sein.
inzwischen hab ich daweil malerfolgreich folgendes abgefragt:
SELECT *
FROM daten_1 d
LEFT JOIN sessions s ON d.phpsessionid = s.phpsessionid
WHERE d.phpsessionid = '47666019b8553f9a9389f863d0d0372a'
und ergibt auch genau einen (DEN) datensatz den ich suche.
jetzt müsste ich das nur für jede der 30 tabellen machen und die mit union verknüpfen? gibt es da einen intelligenteren ansatz als das ganze durch eine träge phpschleife ablaufen zu lassen oder einen seitenlangen query zu basteln, wenn der überhaupt verarbeitet wird?
richard
yo,
das wird es ja schon. Frage15 (inhalt geändert) "Was denkst du über php?
- erlernbarkeit: (zu schwierig/schwierig/leicht/zu leicht) [speichert 1, 2, 3 oder 4 in feld 'antwort1' von daten_15]
- hast du php mit php schon mal die nacht verbracht: (ja/nein) [speichert 1oder0 in 'antwort2' von daten_15]
ich glaube, du machst es dir ein wenig zu schwer. stell dir einfach die unterfragen als ganz normale fragen vor, von mir aus mit den spaltennamen frage_15_1, frage_15_2 usw. wichtig ist nur zu erkennen, dass es keinen unterschied für die tabelle gibt, ob es sich nun um eine normale frage oder eine unterabfrage handelt. mach einfach eine spalte pro antwort, et viola....fertig ist das gericht. ob es sich dann päter um eine unterabfrage handelt oder nicht, kannst du immer noch per programm steuern.
da gebe ich dir normalerweise absolut recht! ABer in diesem fall sind die ansprechpersonen bekannt und identifiziert. und, es muss jede frage sofort gespeichert werden (vorgabe). damit auch bei abbruch die bisherig beantworteten fragen verfügbar sind. klingt dumm, ist es auch, kannnichtsdafür.
nun dumm ist das nicht, schon gar nicht wenn du solche vorgaben hast. ich habe nur vermutet, es handelt sich um eine anonyme umfrage im internet.
und ergibt auch genau einen (DEN) datensatz den ich suche.
jetzt müsste ich das nur für jede der 30 tabellen machen und die mit union verknüpfen?
jein, wie gesgt ich würde die 30 tabellen zu einer zusammenführen. und dann benutze besser union all, sonst schmeist er dir doppelte datensätze raus, in deinem fale eine der antworten. und nicht vergessen, alle queries müssen die gleichew anzahl von spalten besitzen, die angezeigt werden sollen. noch ein kleiner tipp, zu testzwecken ist der joker '*' ok, im life einsatz solltest du dir die mühe machen, spaltennamen anzugeben.
gibt es da einen intelligenteren ansatz als das ganze durch eine träge phpschleife ablaufen zu lassen oder einen seitenlangen query zu basteln, wenn der überhaupt verarbeitet wird?
ja, eine tabelle anstelle von 30 ;-)
Ilja
hallo,
jein, wie gesgt ich würde die 30 tabellen zu einer zusammenführen. und dann benutze besser union all, sonst schmeist er dir doppelte datensätze raus, in deinem fale eine der antworten. und nicht vergessen, alle queries müssen die gleichew anzahl von spalten besitzen, die angezeigt werden sollen. noch ein kleiner tipp, zu testzwecken ist der joker '*' ok, im life einsatz solltest du dir die mühe machen, spaltennamen anzugeben.
ja, beim nächsten mal macht man's immer besser ;)
aber jetzt ist nur noch die gretchenfrage, wie ich mehrere tabellen zusammenfasse, die unterschiedliche feldanzahlen haben. geht das überhaupt? und wenn muss ich (vorerst mal) mit * arbeiten, weil ich schwer eine spalte abfragen kann die in machen tabellen nicht vorhanden ist, oder?
nebenbei würde es mich sehr interessieren ob man feldnamen umbenennen kann ohne das feld zu löschen.
CHANGE COLUMN feldname_alt feldname_neu
funktioniert nämlich nicht. zu recht?
gibt es da einen intelligenteren ...
ja, eine tabelle anstelle von 30 ;-)
mach ich nicht mehr, glaub mir..
grüße,
nebenbei würde es mich sehr interessieren ob man feldnamen umbenennen kann ohne das feld zu löschen.
CHANGE COLUMN feldname_alt feldname_neu
funktioniert nämlich nicht. zu recht?
ja,
ALTER TABLE tabellenname CHANGE feldname_alt feldname_neu eigenschaften
hat funktioniert
yo,
aber jetzt ist nur noch die gretchenfrage, wie ich mehrere tabellen zusammenfasse, die unterschiedliche feldanzahlen haben. geht das überhaupt? und wenn muss ich (vorerst mal) mit * arbeiten, weil ich schwer eine spalte abfragen kann die in machen tabellen nicht vorhanden ist, oder?
jein und nein ;-)
wieviele spalten die tabellen letztlich haben, ist für den union unwichtig. was zählt sind nur die anzahl der spalten, die du mit dem SELECT anzeegen läßt. und diese anzahl muss gleich sein.
und auch das * muss du nicht beim zusammenführen der tabellen nehmen. in prinzip besteht ein union aus mehreren abfragen, die auch so alleine für sich stehen könnten. in prinzip etwa so...
(SELECT tab1.spalte2, tab1.spalte5 FROM tab1 WHERE tab1.aktiv=1)
UNION ALL
(SELECT tab2.spalte1, tab1.spalte3 FROM tab2)
Ilja