php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 05.07.2007, 00:31  
Benutzer
 
Registriert seit: 04.03.2004
Beiträge: 50
Greezoo
Standard Wiederholter statt neuer COUNT bei JOIN

Hi Forum

Nachdem ich mich nun ein bisschen in JOIN (statt WHERE - wie konnte ich nur so lange ohne :wink: ) eingearbeitet habe, stehe ich bei einer Abfrage an. Folgendes ist die Ausgangslage:

Tabelle 1:
| uID | sID |
--------------
| 1 | 2 |
| 2 | 2 |
| 3 | 1 |
| 4 | 2 |

Tabelle 2:
| gID | z1 | z2 | z3 |
-----------------------------
| 1 | 1 | 2 | 4 |
| 2 | 3 | 0 | 0 |
| 3 | 2 | 4 | 0 |
| 4 | 4 | 1 | 0 |

Als Resultat möchte ich Folgendes erreichen:
Für jeden Datensatz aus Tabelle 1, welche in der Spalte sID eine 2 enthält, soll das Vorkommen der uID in allen Spalten in Tabelle 2 gezählt werden.

Die Tabelle sollte dann so aussehen:

Resultat:
| uID | z1 | z2 | z3 |
------------------------
| 1 | 1 | 1 | 0 |
| 2 | 1 | 1 | 0 |
| 4 | 1 | 1 | 1 |

Ich habe nun einige Anläufe genommen, komme aber nun auch durch Testen nicht mehr weiter. Ich schaffe es zwar die Tabelle wie oben gezeigt als Resultat zu erhalten, allerdings stimmen die Werte für z2 und z3 bzw. diese übernehmen einfach den Wert von z1. Ich denke mir, dass ich die Zange beim GROUP BY ansetzen müsste?!
Was ist der (vermutlich) kleine Rest, den ich nicht finden kann?

Hier das Query, welches die obige Output erzeugt:
Code:
SELECT t1.uID, COUNT(t2.z1), COUNT(t2.z2), COUNT(t2.z3)
FROM tabelle1 t1
LEFT JOIN tabelle2 t2 ON t1.uID = t2.z1
WHERE t1.sID = 2
GROUP BY t1.uID
ORDER BY t1.uID ASC
Greezoo ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 05.07.2007, 22:10  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.654
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Greezoo,

ich bin heute Abend geistig nicht mehr so frisch, also erkläre mir dein Vorhaben doch nochmal. Ich habe nämlich so das Gefühl, dass du hier einen netten Design-Fehler in dein DB-Layout gezimmert hast, was dich dazu bringt, dass du das nicht in einem Statement erschlagen kannst. Interessant wäre nun auch noch, für was du dieses Konstrukt benötigts.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 06.07.2007, 10:18  
Benutzer
 
Registriert seit: 04.03.2004
Beiträge: 50
Greezoo
Standard

Hi!

Danke schon mal für die Antwort! Ich weiss, dass es nicht besonders schön ist - allerdings ist mir kein wirklich schönerer Ansatz eingefallen.

Also, ich versuchs mal so um zu erklären:

Tabelle 1 enthält Mitarbeiter. Jeder Mitarbeiter gehört einer Abteilung an (sID). Tabelle 2 sind die Projekte. Jedes Projekt besitzt einen Projektleiter (z1) sowie keinen, einen oder zwei Stellvertreter (z2, z3).

Was ich nun haben möchte ist, dass ich für jeden Mitarbeiter der Abteilung 2 eine Auflistung erhalte, wie oft er als Projektleiter, 1. Stellvertreter und 2. Stellvertreter eingesetzt ist.

So - nun hoffe ich, mit diesem Beitrag auch die letzten Klarheiten beseitigt zu haben! :wink:
Greezoo ist offline   Mit Zitat antworten
Alt 06.07.2007, 10:43  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.654
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Greezoo,

dann würde ich das ganz anders lösen, denn dein Ansatz ist zu unflexibel. Vorschlag für die Tabellen:

- Mitarbeiter
- Projekt
- Abteilung
- ass_Mitarbeiter_Abteilung
- ass_Mitarbeiter_Projekt_Projektleitung
- ass_Mitarbeiter_Projekt_Stellvertreter

Wenn du nun abfragen möchtest, wer zu einem Projekt Stellvertreter ist, musst du dir nur die Liste aller Personen einer Abteilung selektieren (JOIN über Mitarbeiter zu "ass_Mitarbeiter_Abteilung" zu Abteilung) und fragen, wie viele Beziegungen jeder Mitarbeiter in der Stellvertreter-Beziehungs-Tabelle "ass_Mitarbeiter_Projekt_Stellvertreter" hat. Möchtest du das noch auf ein Projekt beschränken, kannst du auch nochmals über "ass_Mitarbeiter_Projekt_Stellvertreter" nach "Mitarbeiter" JOINen.

Der Hintergdanke an diesem Design ist, dass man teilweise denormalisiert und Objekte (wie Person, Firma, ...) und deren Beziehungen (Person ist Mitarbeiter einer Firma) getrennt abspeichert. Das führt zwar zum Einsatz von einigen JOINs, nur bringt das einiges an Flexibilität ins Spiel. Man kann nun, wenn die Applikation weitere Objekte durch neue Module hinzubekommt die bisherige Struktur bestehen lassen und einfach Beziehungen zu bestehenden Objekten hinzufügen. Any questions left?
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 06.07.2007, 11:29  
Benutzer
 
Registriert seit: 04.03.2004
Beiträge: 50
Greezoo
Standard

Danke für die Ausführung! Diesen Ansatz hatte ich auch mal im Kopf allerdings hatte ich den wegen 3 weiteren Tabellen verworfen (ich mag's schlank :P ).

Ich dachte, es wäre doch irgendwie möglich, ich werde es allerdings dann halt umbauen müssen!
Greezoo ist offline   Mit Zitat antworten
Alt 06.07.2007, 14:10  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.654
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von Greezoo
Ich dachte, es wäre doch irgendwie möglich, ich werde es allerdings dann halt umbauen müssen!
Sobald du Mehrfachbeziehungen hast, wird die Sache mit einfachen Foreign Key Konstrukten nicht mehr sinnvoll nutzbar.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. 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
Mehrfach Join lazydog Datenbanken 2 08.05.2008 16:09
[gelöst]LEFT JOIN, DINSTINCT und trotzdem doppelte?!?! stefanjann Datenbanken 10 06.02.2008 11:49
WHERE-Clause im Left Join cycap Datenbanken 2 06.11.2007 11:06
JOIN / LEFT JOIN und Co prinzli Datenbanken 12 05.11.2007 22:15
Count Problem bei einem Join obi Datenbanken 3 18.06.2007 14:29
problem beim mehrfachen joinen einer tabelle und count() PHS Datenbanken 3 03.08.2006 16:49
Count mit mehreren Joins cyberholic Datenbanken 4 07.06.2006 23:35
Problem mit Inner join Jabi Datenbanken 15 09.05.2006 14:10
INNER JOIN + Suchkriterien + Abfrage duerov PHP Tipps 2006 4 04.04.2006 12:47
"Column count doesn't match value count at row 1" möchtegernchegga Datenbanken 3 05.03.2006 16:07
inner join aus db PHP Tipps 2006 8 22.01.2006 01:23
mehrere COUNT() auf selbe Tabelle und »can't reopen table« tapferesschneiderlein Datenbanken 3 04.04.2005 13:51
JOIN mit count db Datenbanken 1 23.09.2004 13:09
[Erledigt] Count Down und aktueller stand HTML, Usability und Barrierefreiheit 4 20.07.2004 11:13
[Erledigt] Count Down und aktuellster stand PHP Tipps 2004 2 05.07.2004 15:46

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
count im join, statt where and, z1 z2 z3 join

Alle Zeitangaben in WEZ +2. Es ist jetzt 06:33 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

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.