CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren |
04.08.2013, 20:55:28
|
Anfänger
|
|
Registriert seit: Aug 2013
Alter: 54
Beiträge: 5
|
|
Komplexe Abfrage mit drei Tabellen
Hallo, ich versuche seit einer ganzen Weile eine Abfrage in meiner Datenbank zu erstellen. Ich habe folgende Tabellen:
Tabelle A:
ID|name (string) | ...
Tabelle B: Jointabelle mit zwei Schlüsseln
a_id|c_id
Tabelle C:
ID|active (boolean)| ...
Zeilen aus A können mehrern Zeilen in C zugeordnet sein. Es gibt maximal ein "true" bezogen auf solche Einträge in C, die zu einem Eintrag in A gehören.
----------------------------------------------------------------------------------------
Die Abfrage soll mir alle Einträge aus A liefern, die bei der Spalte "active" in Tabelle C entweder
"NULL" haben (noch keinen Eintrag in C)
ODER (wenn Einträge in C)
"false" haben, aber nur WENN
kein einziges "true" für Einträge in C auftritt, die zu einem Eintrag in A gehören
----------------------------------------------------------------------------------------
Wie sieht eine solche Abfrage aus?
Ich habe bisher versucht mit zwei LEFT OUTER JOINS zu arbeiten um eine Große Tabelle zu erzeugen. Dann habe ich über WHERE versucht die Einträge in C mit einem "true" in der Spalte "active" herauszufiltern. Dazu habe ich mit der COUNT Funktion experimentiert.
Letztlich ist es nun so, dass ich nur NULL-Einträge bekomme und Einträge, die sowohl "true" als auch "false" für Einträge die zu A gehören, haben. Die notwendige Bedingung kann ich nicht erzeugen...
|
05.08.2013, 17:02:23
|
|
Administrator
|
|
Registriert seit: Jul 2004
Beiträge: 3.707
|
|
AW: Komplexe Abfrage mit drei Tabellen
Hallo und willkommen hier im Forum.
Kannst Du uns noch zu jeder Tabelle mal 5-7 aussagekräftige Beispieldatensätze zeigen.
__________________
Gruss vt1816
Erwarte nicht, dass sich jemand mehr Mühe mit der Antwort gibt als Du Dir mit der Frage.
. . . . . Feedback wäre wünschenswert
Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.
Ansosnten gilt: Hilfe ausserhalb dieses Thread (PN, WhatsApp, Skype, Mail, ICQ, etc...) nur per Barzahlung oder Vorauskasse!
Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
|
08.08.2013, 18:41:56
|
|
SELFPHP Guru
|
|
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
|
|
AW: Komplexe Abfrage mit drei Tabellen
Zitat:
Zitat von vt1816
Kannst Du uns noch zu jeder Tabelle mal 5-7 aussagekräftige Beispieldatensätze zeigen.
|
Du meinst das sicher so:
Zitat:
Kannst Du uns noch zu jeder Tabelle das CREATE TABLE sowie 5-7 aussagekräftige Beispieldatensätze zeigen.
|
|
09.08.2013, 16:45:24
|
Anfänger
|
|
Registriert seit: Aug 2013
Alter: 54
Beiträge: 5
|
|
AW: Komplexe Abfrage mit drei Tabellen
Das CREATE bekomme ich nicht ganz zusammen, aber ich kann es etwas bildlicher machen.
Es geht um ein browserbasiertes Spiel.
Die Tabelle A enthält Einheiten, die Tabelle C enthält Missionen die eine Einheit gerade durchführt oder bereits durchgeführt hat. Der Status der Mission wird über das Attribut "active" unterscheiden. Die Tabelle B hat nur die Funktion Missionen und Helden zu verbinden.
Ich will jede Einheit bekommen, die aktuell keine Mission hat (d.h. keinen Eintrag mit active=true) und jede Einheit, die noch keine Missionen durchgeführt hat (Eintrag mit active=NULL). Ich hatte es mit folgender Anfrage versucht:
Code:
SELECT * FROM `entities`
LEFT OUTER JOIN entities_missions ON entities_missions.entity_id = entities.id
LEFT OUTER JOIN missions ON entities_missions.mission_id = missions.id
WHERE (
(select COUNT(missions.active) from (entities)
LEFT OUTER JOIN entities_missions ON (entities_missions.entity_id = entities.id)
LEFT OUTER JOIN missions ON (entities_missions.mission_id = missions.id)
WHERE (missions.active = true) ) = 0
)
OR missions.active is null
Leider funktioniert die Anweisung im ersten Teil der äußeren Bedinungen nicht so wie gewünscht (count...), da Einheiten angezeigt werden, die aktive und inaktive Missionen haben.
|
09.08.2013, 19:43:40
|
|
SELFPHP Guru
|
|
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
|
|
AW: Komplexe Abfrage mit drei Tabellen
Zitat:
Zitat von Drrrrrr
Das CREATE bekomme ich nicht ganz zusammen, aber ich kann es etwas bildlicher machen.
|
Nein.
Code:
SHOW CREATE TABLE tabellenname;
Zitat:
Es geht um ein browserbasiertes Spiel.
|
Is mir Rille. Ich will wissen, mit welchen Bedingungen die Tabelle erstellt wurde, und ich will wissen, welche korrekten Datensätze dort eingetragen werden können.
Wenn Dir das zuviel ist, dann such Dir ein anderes Hobby.
|
10.08.2013, 09:16:12
|
Anfänger
|
|
Registriert seit: Aug 2013
Alter: 54
Beiträge: 5
|
|
AW: Komplexe Abfrage mit drei Tabellen
Die einzige Besonderheit an den Tabellen ist, dass die Jointabelle ohne ID erstellt ist (braucht sie auch nicht).
Beispieldatensatz aus der verschränkten Tabelle sieht etwa so aus
ID|name|active
1|Einheit1|0
2|Einheit2|0
3|Einheit1|1
4|Einheit3|1
5|Einheit2|0
6|Einheit4|NULL
Ergebnis sollte so aussehen.
2|Einheit2|0
6|Einheit4|NULL
Begründung: Einheit1 hat einen true-Wert bei active. Einheit3 hat ebenfalls einen true-Wert bei active, allerdings ohne einen anderen zu haben, der false hat.
Wenn ich weiß wie ich dieses ergebnis erreichen kann, kann ich den Rest schon selbst erzeugen...
Geändert von Drrrrrr (10.08.2013 um 09:32:47 Uhr)
|
10.08.2013, 11:23:08
|
Member
|
|
Registriert seit: Nov 2007
Beiträge: 843
|
|
AW: Komplexe Abfrage mit drei Tabellen
Hi,
Zitat:
kann ich den Rest schon selbst erzeugen
|
Nein wirst du nicht denn wenn du uns nicht mal mit
Zitat:
SHOW CREATE TABLE tabellenname;
|
+ Bsp. Datensätze liefern kannst wirst du immer wieder hier aufschlagen
weil du nicht mal die Grundlagen beherrscht!
MfG
CKaos
__________________
"Wenn die Leute Häuser so bauen würden, wie wir Programme schreiben, würde der erstbeste Specht unsere Zivilisation zerhacken."
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!
|
10.08.2013, 16:08:03
|
Anfänger
|
|
Registriert seit: Aug 2013
Alter: 54
Beiträge: 5
|
|
AW: Komplexe Abfrage mit drei Tabellen
Ich nutze zum Erstellen meiner Tabellen das Ruby on Rails Framework (hobbymäßig seit 5 Jahren), das mir die unproduktive, nicht wertschöpfende Arbeit mit SQL Anweisungen weitgehend abnimmt. Daher kann ich ohne größeren Aufwand nicht die genaue Syntax der Tabellenerstellung wiedergeben, zumal sie für die Problemstellung weitgehend irrelevant ist.
Ich hier dennoch die Formulierung in Rails, die alle wesentlichen Informationen enthält aufgeführt. Aus der Syntax kann man ablesen, wie die Tabellen aufgebaut sind und welche zusätzlichen Parameter verwendet wurden...Beispieldaten sind auch angefügt.
Zitat:
create_table "entities", :force => true do |t|
t.string "name"
end
create_table "entities_missions", :id => false, :force => true do |t|
t.integer "mission_id"
t.integer "entity_id"
end
create_table "missions", :force => true do |t|
t.string "name"
t.boolean "active"
end
|
Beispieldatensätze sehen nun so aus:
Entities Tabelle:
Zitat:
ID|name
1|Einheit1
2|Einheit2
3|Einheit3
4|Einheit4
5|Einheit5
|
EntitiesMissions Tabelle:
Zitat:
entity_id|mission_id
1|1
1|2
2|3
2|4
3|5
4|6
|
Missions Tabelle:
Zitat:
ID|name|active
1|Mission1|0
2|Mission2|1
3|Mission2|0
4|Mission4|0
5|Mission5|0
6|Mission6|1
|
Wie gesagt suche ich die Einheiten, die entweder keine aktive Mission haben ODER noch überhaupt keine Mission haben
|
10.08.2013, 20:23:25
|
|
SELFPHP Guru
|
|
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
|
|
AW: Komplexe Abfrage mit drei Tabellen
Zitat:
Zitat von Drrrrrr
Wie gesagt suche ich die Einheiten, die entweder keine aktive Mission haben ODER noch überhaupt keine Mission haben
|
Viel Spaß noch beim Suchen. Fehlendes Wissen kannste Dir da:
http://dev.mysql.com/doc/refman/5.1/en/
und da:
http://www.php.net/manual/en/
anlesen. Offenbar willst Du den Fehler selber finden, da Du immer noch nicht die angeforderten Informationen rausrückst.
|
11.08.2013, 12:21:59
|
Anfänger
|
|
Registriert seit: Aug 2013
Alter: 54
Beiträge: 5
|
|
AW: Komplexe Abfrage mit drei Tabellen
Habe das Problem selbst lösen können.
Es ist möglich das gewünschte Ergebnis zu erhalten, wenn man die Tabellen über LEFT OUTER JOINS verschränkt (Alle Einträge inkl der mit 'missions.active = NULL') und als Bedinung ein NOT IN verwendet. Das NOT IN bezieht sich dann auf die IDs derjenigen Einträge in der verschränkten Tabelle, die ein 'missions.active = true' haben.
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 07:23:17 Uhr.
|