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 |

02.09.2010, 10:11:30
|
Anfänger
|
|
Registriert seit: Sep 2010
Alter: 48
Beiträge: 4
|
|
Doppelte Abfrage in einem SELECT
Hallo,
ich suche die Möglichkeit, einer Abfrage für eine Abfrage:
Code:
SELECT event.ID
FROM event
LEFT JOIN inst_loc ON (inst_loc.ID = event.id_inst_loc)
LEFT JOIN city ON (city.ID = inst_loc.id_city)
LEFT JOIN province ON (province.ID = city.id_province)
LEFT JOIN country ON (country.ID = city.id_country)
LEFT JOIN event_job ON (event_job.id_event = event.ID)
WHERE (event_job.id_job = '44') AND event.deleted = '0'
GROUP BY event.ID ORDER BY event.event_date DESC
Bringt mir die IDs für relevante Einträge.
Diese IDs möchte ich nun nach country.ID gruppieren und zählen,
möglichst in der gleichen Abfrage.
Also wieviele Events, die obiger Abfrage entsprechen kommen in den verschiedenen
Ländern wie oft vor.
Problem: Ich benötige schon in der ersten Abfrage ein GROUP BY, um doppelte
Einträge auszuschliessen.
Danke für Hinweise
Mark Knochen
Geändert von cortex (02.09.2010 um 10:38:48 Uhr)
Grund: code-Tags
|

02.09.2010, 10:26:32
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 15
Beiträge: 395
|
|
AW: Doppelte Abfrage in einem SELECT
Ich bin mir nicht sicher, ob ich die Frage richtig verstanden habe.
mögliche Lösung:
Code:
SELECT country.id, event.id, COUNT(*) AS anzahl_events_pro_country
FROM event
LEFT JOIN inst_loc
ON (inst_loc.id = event.id_inst_loc)
LEFT JOIN city
ON (city.id = inst_loc.id_city)
LEFT JOIN province
ON (province.id = city.id_province)
LEFT JOIN country
ON (country.id = city.id_country)
LEFT JOIN event_job
ON (event_job.id_event = event.id)
WHERE (event_job.id_job = '44')
AND event.deleted = '0'
GROUP BY country.id, event.id
ORDER BY event.event_date DESC;
Oder zeige mal, wie die gewünschte Ausgabe aussehen soll.
Grüße
Thomas
|

02.09.2010, 10:39:39
|
SELFPHP Profi
|
|
Registriert seit: Apr 2008
Alter: 49
Beiträge: 1.938
|
|
AW: Doppelte Abfrage in einem SELECT
@Mark: bitte passende code-Tags nutzen.
cx
|

02.09.2010, 10:49:49
|
Anfänger
|
|
Registriert seit: Sep 2010
Alter: 48
Beiträge: 4
|
|
AW: Doppelte Abfrage in einem SELECT
Mh, so haut es nicht hin:
Die erste Abfrage zieht alle Events aus der DB denen ein oder mehrere Jobs mit der ID 44 zugeordnet ist - daher hier GROUP BY auf die event.ID
Aus dieser Menge will ich dann als Endergebnis haben:
500 Events mit dem Job Musik aus Deutschland
250 Events mit dem Job Musik aus Österreich
150 Events mit dem Job Musik aus der Schweiz
Das ist das Ziel.
Mark
|

02.09.2010, 11:23:20
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 15
Beiträge: 395
|
|
AW: Doppelte Abfrage in einem SELECT
Ob die Syntax nun genau stimmt, kann ich leider nicht ausprobieren, da bräuchte ich Deine Tabellenstrukturen und ein paar Testdaten.
Also eventuell so..Pro Land, alle Events zählen
Code:
SELECT country.*, anzahl.events_pro_country
FROM (SELECT country.id AS country_id, COUNT(*) AS events_pro_country
FROM event
LEFT JOIN inst_loc
ON (inst_loc.id = event.id_inst_loc)
LEFT JOIN city
ON (city.id = inst_loc.id_city)
LEFT JOIN province
ON (province.id = city.id_province)
LEFT JOIN country
ON (country.id = city.id_country)
LEFT JOIN event_job
ON (event_job.id_event = event.id)
WHERE (event_job.id_job = '44')
AND event.deleted = '0'
GROUP BY country.id) anzahl
JOIN country
ON country.id = anzahl.country_id;
Also falls es nicht stimmt, bitte die notwendigen Tabellenstrukturen plus ein paar Testdaten mitliefern, damit ich es entsprechend ausprobieren kann. Allein aus dem Kopf ist es schon etwas schwierig.
Grüße
Thomas
|

02.09.2010, 11:29:22
|
Anfänger
|
|
Registriert seit: Sep 2010
Alter: 48
Beiträge: 4
|
|
AW: Doppelte Abfrage in einem SELECT
Oh, danke, das sieht super aus - ich checke nur mal die Mengen, ob das mit den Einträgen aus der DB passt - danke schonmal.
Das mit den SubSelects kann ich mir immer so schwer vorstellen - gibt's da evtl. eine Seite, die das "GUT" erklärt - ich hänge da immer wieder.
Danke nochmals
Mark
|

02.09.2010, 11:41:45
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 15
Beiträge: 395
|
|
AW: Doppelte Abfrage in einem SELECT
Zitat:
Zitat von Mark Knochen
Das mit den SubSelects kann ich mir immer so schwer vorstellen - gibt's da evtl. eine Seite, die das "GUT" erklärt - ich hänge da immer wieder.
|
Formal ist das kein SubSelect, sondern nach "Oracle-sprech" ein Inline View.
Schau Dich mal nach SQL-Büchern mit Schwerpunkt JOIN um. Ansonsten empfiehlt sich noch QWERTZU - spricht die Tastatur die vor Dir liegt. Also einfach mal dransetzen und ausprobieren...
Grüße
Thomas
Geändert von thomas_w (02.09.2010 um 12:00:35 Uhr)
Grund: Schreibfehler korrigiert
|

02.09.2010, 16:11:54
|
Anfänger
|
|
Registriert seit: Sep 2010
Alter: 48
Beiträge: 4
|
|
AW: Doppelte Abfrage in einem SELECT
Hallo nochmal,
ganz stimmt es noch nicht - aber fast.
Ich habe es nochmal aufgesplittet:
SELECT *
FROM `event`
LEFT JOIN event_job ON ( event_job.id_event = event.ID )
WHERE event.deleted = '0'
AND event.id_inst_loc != '0'
AND event_job.id_job = '44'
GROUP BY event.ID
Bringt alle Events, die einen Job mit der ID 44 beinhalten und einen Ort haben (inst_loc)
Ergebnis: 749 Events.
Aus diesen nun die Gruppierung nach Land.
Die Abfrage vorhin (sieheb oben) ergibt:
Österreich 108
Schweiz 47
Deutschland 703
Liechtenstein 1
Italia 8
România 12
also deutlich mehr Events, als in diese Konstellation vorhanden sind - ich vermute da doch noch doppelte EventIDs in der Abfrage?
Mark
|

02.09.2010, 19:55:09
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 15
Beiträge: 395
|
|
AW: Doppelte Abfrage in einem SELECT
Zitat:
Zitat von Mark Knochen
also deutlich mehr Events, als in diese Konstellation vorhanden sind - ich vermute da doch noch doppelte EventIDs in der Abfrage?
|
Gut möglich, dass mit den JOINs irgendwas nicht stimmt. Da habe ich nur Deinen SQL weiter verwendet. Deshalb nochmal mein Hinweis..
Zitat:
Zitat von thomas_w
Also falls es nicht stimmt, bitte die notwendigen Tabellenstrukturen plus ein paar Testdaten mitliefern, damit ich es entsprechend ausprobieren kann. Allein aus dem Kopf ist es schon etwas schwierig.
|
Am SQL allein lassen sich die Tabellenstrukuren leider nur erraten.
Grüße
Thomas
|

02.09.2010, 20:30:07
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 15
Beiträge: 395
|
|
AW: Doppelte Abfrage in einem SELECT
Also Notlösung wäre noch der DISTINCT im COUNT() möglich, also in etwa so..
Code:
SELECT country.*, anzahl.events_pro_country
FROM (SELECT country.id AS country_id, COUNT(DISTINCT event.id) AS events_pro_country
FROM event
LEFT JOIN inst_loc
ON (inst_loc.id = event.id_inst_loc)
LEFT JOIN city
ON (city.id = inst_loc.id_city)
LEFT JOIN province
ON (province.id = city.id_province)
LEFT JOIN country
ON (country.id = city.id_country)
LEFT JOIN event_job
ON (event_job.id_event = event.id)
WHERE (event_job.id_job = '44')
AND event.deleted = '0'
GROUP BY country.id) anzahl
JOIN country
ON country.id = anzahl.country_id;
Vielleicht hilft es einen Schritt weiter, aber eigentlich sollten besser die JOINS im SQL korrigiert werden.
Grüße
Thomas
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Ansicht |
Linear-Darstellung
|
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:59:10 Uhr.
|