# sql query 2 Tabellen welche Zeilen fehlen



## Scuzzi (1. Juni 2013)

Hallo,

Ich weiss nicht mehr weiter, deshalb wende ich mich an euch.

Die Anforderung

Ich habe eine Tabelle mit Aufgaben

Ich habe Benutzer die diese Aufgaben erledigen müssen (alle müssen die selben Aufgaben erledigen)

Ich will sehen welcher kunde welche Aufgabe erledigt resp. noch nicht erledigt hat.

z.Z. involvierte Tabellen

kunden (id)
aufgaben (id)
kunden_aufgaben(hier werden die erledigten Aufgaben erfasst)
kunden_aufgaben hat referenzen zu kunden und aufgaben.

Im Moment habe ich eine csv datei mit den Aufgaben. Ich fülle die Referenz Kunden_id mit der kunden id des neuen kunden
und importiere diese dann. über ein Feld erledigt definiere ich den Status. Ich kann so arbeiten, aber ist natürlich nicht wirklich
gut.

Ich probiere schon eine ganze weile dies zu lösen, komme aber nicht weiter.

kann mir jemand helfen. 

Wenn nötig ändere ich natürlich auch das design. Ich brauche hier einfach einen Lösungungsweg für diese Aufgabe.

Danke schon mal für eure Unterstützung

Salvatore


----------



## sheel (1. Juni 2013)

Hi und Willkommen bei tutorials.de,

was findest du genau "nicht wirklich gut"?


----------



## Scuzzi (1. Juni 2013)

ich finde nicht gut, dass ich für jeden kunden eine todo liste mit csv importieren muss!

was ist das ziel?
ich möchte eine mastertabelle mit n aufgaben erstellen.
wenn ein kunde aus dieser tabelle einen job erledigt hat, trage ich das ein. nun möche ich sehen, welche jobs er erledigt und welche jobs noch offen sind! das sollte doch möglich sein.
ich denke das ich die tabelle erledigte jobs mit der mastertabelle vergleichen kann, und mir die noch nicht erledigten jobs anzeigt! die erledigten jobs sehe ich ja dann in der tabelle erledigte jobs.
also ganz abstrakt ausgedrückt
vergleiche master iob tabelle mit der erledigt job tabelle und zeige alle die noch offen sind. natürlich pro kunde! ich hoffe ich habs einigermassen verständlich ausgedrückt


----------



## BaseBallBatBoy (1. Juni 2013)

```
select 
  k.name as kunde,
  a.name as aufgabe,
  case
    when ka.kunden_id is null then 'Offen'
    else 'Erledigt'
  end as status 
from
  aufgaben a
cross join
  kunden k
left join
  kunden_aufgaben ka
on
  ka.kunden_id = k.id
  and
  ka.aufgaben_id = a.id
order by
  k.id, 
  a.id;
```

http://www.sqlfiddle.com/#!4/32809/38


----------



## Scuzzi (1. Juni 2013)

Hallo, das ging ja unglaublich schnell! Ich war arbeiten, doch jetzt probiere ich das aus! ich danke dir, euch im voraus! gebe dann bescheid! 
lg Salvatore


----------



## Scuzzi (2. Juni 2013)

OK, dass hat perfekt funktioniert. 

Wie immer kommt da noch was....

Ist es möglich, direkt aus dieser Liste jetzt einen aufgabe als erledigt zu markieren?


----------



## saftmeister (2. Juni 2013)

Scuzzi hat gesagt.:


> Ist es möglich, direkt aus dieser Liste jetzt einen aufgabe als erledigt zu markieren?



Wenn du als Suchkriterium die Aufgaben-ID und als Einfüge-Wert die Kunden-ID mit abgeholt hast (dafür müsstest du den ersten SELECT erweitern), sollte das kein Problem darstellen:


```
UPDATE kunden_aufgaben SET kunden_id = [hier_kunden_id_aus_dem_select] WHERE aufgaben_id = [hier_aufgaben_id_aus_dem_select];
```


----------



## BaseBallBatBoy (2. Juni 2013)

Scuzzi hat gesagt.:


> OK, dass hat perfekt funktioniert.
> 
> Wie immer kommt da noch was....
> 
> Ist es möglich, direkt aus dieser Liste jetzt einen aufgabe als erledigt zu markieren?



Das einzige was du tun kannst ist das select query um a.id und k.id erweitern so wie saftmeister geschrieben hat.

Danach danach musst du aber eine neue insert query absetzen mit den id's die du als erledigt markieren willst:

```
INSERT INTO kunden_aufgaben VALUES (kunden_id, aufgaben_id);
```

Tipp: Du solltest aber aufpassen, dass das selbe kunden-aufgaben-paar nicht zweimal in der Tabelle steht. Das kannst du mit einem Unique Index über beide Spalten erreichen.


----------



## Scuzzi (3. Juni 2013)

Hallo,
Ich stecke beim INSERT fest, aber zuerst noch eine kleine Erklärung,

Die Kunden, resp. deren ausgeführten jobs werden natürlich bewertet (BW von 1-5), Sie können es 10 mal versuchen, so hab ich die Tabelle "sb" (kunden_aufgaben) aufgebaut und gearbeitet.
Das "Done" war bisher "Erledigt", halt auch in der Tabelle sb (Ja,Nein)

Hier mal der Code; der läuft
------------------------------------------

```
select
  k.kunden_id as Kunden,
  a.id as Aufgaben,
  ka.done,
  ka.bw01,
  ka.bw02,
  ka.bw03,
  ka.bw04,
  ka.bw05,
  ka.bw06,
  ka.bw07,
  ka.bw08,
  ka.bw09,
  ka.bw10,
  
  case
    when ka.kunden_id is null then ''
    else 'Erledigt'
  end as status 
from
  anf a
cross join
  kunden k
left join
  sb ka
on
  ka.kunden_id = k.kunden_id
  and
  ka.anf_id = a.id
order by
  k.kunden_id, 
  a.id
```

-------------------------------------------------------

INSERT Code; der läuft nicht (Eröffnungs Datensatz)
-------------------------------------------------------

```
INSERT INTO sb VALUES
(NULL, <-- primärschlüssel von sb (habe ich in anderen querys auch so gemacht)
 :kunden_id,
 :anf_id,
 :done,
 :bw01,
 :bw02,
 :bw03,
 :bw04,
 :bw05,
 :bw06,
 :bw07,
 :bw08,
 :bw09,
 :bw10);
```
----------------------------------------------------------
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':kunden_id, :anf_id, 1, 3, N' at line 3

Ich bin mir sicher es liegt ganz nahe und hat eben wie ihr sagt mit den id's zu tun,
für mein verständnis habe ich die drin, aber eben:-(

-----------------------------------------------

Wenn das mal geht, dann müsste ja für eine weitere Bewertung dieses Jobs, vor ab geprüft werden, ob Eintrag existiert. Wenn ja ist es kein INSERT mehr sondern ein Update und das müsste automatisch swichen, geht das überhaupt?

Ich weiss nicht wie ich euch danken kann, und bekomme langsam auch ein schlechtes gewissen!


----------



## Yaslaw (3. Juni 2013)

Beim Insert nach Values solltest du die Feldliste mitgeben

```
INSERT INTO mytable 
-- Diese Auflistung fehlt dir
(feld_1, feld_2)
VALUES(1, 2)
```


----------



## Scuzzi (3. Juni 2013)

Hallo,

ok, INSERT läuft, somit ist der Basis Eintrag gemacht;

Code;

INSERT INTO sb VALUES
(NULL,
 :Kunden,
 :Aufgaben,
 :done,
 :bw01,
 :bw02,
 :bw03,
 :bw04,
 :bw05,
 :bw06,
 :bw07,
 :bw08,
 :bw09,
 :bw10);

Ist nicht wirklich schwierig:-0,
Habe nicht gewusst, dass ich die Aliases (Kunden/Aufgaben) vom SELECT übernehmen kann,muss!

So..

Der Hammer wäre jetzt, wenn ich in diesem Script eine Abfrage machen könnte, ob dieser Record  (Kunden, Aufgaben) schon existiert und wenn ja, soll er einen UPDATE machen. Kann man das vom SELECT übernehmen?


----------



## Yaslaw (3. Juni 2013)

*INSERT .... ON DUPLICATE KEY UPDATE* heisst das Konstrukt welches du haben willst.
http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html


----------



## Scuzzi (5. Juni 2013)

Hallo,

Hab lange probiert und habs soweit hingebracht, dass er mal einen doppelten eintrag schreibt.
Irgendwie hab ich es aber hingebracht dass es nicht mehr geht.

Könnt Ihr mir bitte helfen, diesen INSERT und ON DUPLICATE UPDATE anzupassen, resp. zu ergänzen. Ich drehe im Kreis

Hier nochmals den SELECT
--------------------------------------------------
select
  k.kunden_id as Kunden,
  a.id as Aufgaben,
  ka.done,
  ka.bw01,
  ka.bw02,
  ka.bw03,
  ka.bw04,
  ka.bw05,
  ka.bw06,
  ka.bw07,
  ka.bw08,
  ka.bw09,
  ka.bw10,
  case
    when ka.kunden_id is null then ''
    else 'Erledigt'
  end as status 
from
  anf a
cross join
  kunden k
left join
  sb ka
on
  ka.kunden_id = k.kunden_id
  and
  ka.anf_id = a.id
order by
  k.kunden_id, 
  a.id



Hier mal ein Versuch zumindest wieder einen Doppelten Eintrag hinzukriegen, Funktioniert aber nicht mehr,

-------------------------------------------------------

INSERT INTO sb VALUES
(NULL,
 :Kunden,
 :Aufgaben,
 :done,
 :bw01,
 :bw02,
 :bw03,
 :bw04,
 :bw05,
 :bw06,
 :bw07,
 :bw08,
 :bw09,
 :bw10)

 ON DUPLICATE KEY UPDATE
 Kunden = :Kunden,
 Aufgaben = :Aufgaben,
 done = :done,
 bw01 = :bw01,
 bw02 = :bw02,
 bw03 = :bw03,
 bw04 = :bw04,
 bw05 = :bw05,
 bw06 = :bw06,
 bw07 = :bw07,
 bw08 = :bw08,
 bw09 = :bw09,
 bw10 = :bw10;

-------------------------------------------------------------

Es kommt immer die Fehlermeldung, aber ich habe gemeint, so hab ich zumindest mal einen Doppelten Eintrag erstellen können, funktioniert aber auch nicht mehr.

Unknown column 'Kunden' in 'field list'


----------



## Yaslaw (5. Juni 2013)

Du solltest eine Feld-Liste vor dem INTO mitgeben

```
INSERT INTO table (field1, field2)
VALUES ('value1', 'value2')
ON DUBLICATE ....
```


----------



## Scuzzi (6. Juni 2013)

Habe ich gemacht, aber eben, es kommt auch hier eine Fehlermeldung

Column count doesn't match value count at row 1


----------



## Yaslaw (6. Juni 2013)

Du musst gleich viele Felder angeben wie du nachher Werte angibst. Das sagt diese Fehlermeldung aus.
Zeig mal dein Versuch und dann sehen wir eher wo du dich verzählt hast.


----------



## Scuzzi (6. Juni 2013)

Was mach ich falsch,

Unknown column 'Kunden' in 'field list' 

INSERT INTO sb (Kunden, Aufgaben, done, bw01,bw02,bw03, bw04,
               bw05, bw06, bw07, bw08, bw09, bw10)
VALUES
Kunden,
 :Aufgaben,
 :done,
 :bw01,
 :bw02,
 :bw03,
 :bw04,
 :bw05,
 :bw06,
 :bw07,
 :bw08,
 :bw09,
 :bw10)

 ON DUPLICATE KEY UPDATE
 Kunden = :Kunden,
 Aufgaben = :Aufgaben,
 done = :done,
 bw01 = :bw01,
 bw02 = :bw02,
 bw03 = :bw03,
 bw04 = :bw04,
 bw05 = :bw05,
 bw06 = :bw06,
 bw07 = :bw07,
 bw08 = :bw08,
 bw09 = :bw09,
 bw10 = :bw10;


----------



## Scuzzi (6. Juni 2013)

Hier nochmals den SELECT

select
  k.kunden_id as Kunden,
  a.id as Aufgaben,
  ka.done,
  ka.bw01,
  ka.bw02,
  ka.bw03,
  ka.bw04,
  ka.bw05,
  ka.bw06,
  ka.bw07,
  ka.bw08,
  ka.bw09,
  ka.bw10,
  case
    when ka.kunden_id is null then ''
    else 'Erledigt'
  end as status 
from
  anf a
cross join
  kunden k
left join
  sb ka
on
  ka.kunden_id = k.kunden_id
  and
  ka.anf_id = a.id
order by
  k.kunden_id, 
  a.id


----------



## Scuzzi (6. Juni 2013)

select
  k.kunden_id as Kunden,
  a.id as Aufgaben,
  ka.done,
  ka.bw01,
  ka.bw02,
  ka.bw03,
  ka.bw04,
  ka.bw05,
  ka.bw06,
  ka.bw07,
  ka.bw08,
  ka.bw09,
  ka.bw10,
  case
    when ka.kunden_id is null then ''
    else 'Erledigt'
  end as status 
from
  anf a
cross join
  kunden k
left join
  sb ka
on
  ka.kunden_id = k.kunden_id
  and
  ka.anf_id = a.id
order by
  k.kunden_id, 
  a.id

---------------------------------------------------------------------------------------------


INSERT INTO sb (Kunden, Aufgaben, done, bw01,bw02,bw03, bw04,
               bw05, bw06, bw07, bw08, bw09, bw10)
VALUES
Kunden,
 :Aufgaben,
 :done,
 :bw01,
 :bw02,
 :bw03,
 :bw04,
 :bw05,
 :bw06,
 :bw07,
 :bw08,
 :bw09,
 :bw10)

 ON DUPLICATE KEY UPDATE
 Kunden = :Kunden,
 Aufgaben = :Aufgaben,
 done = :done,
 bw01 = :bw01,
 bw02 = :bw02,
 bw03 = :bw03,
 bw04 = :bw04,
 bw05 = :bw05,
 bw06 = :bw06,
 bw07 = :bw07,
 bw08 = :bw08,
 bw09 = :bw09,
 bw10 = :bw10;

----------------------------------------------------------------------

Unknown column 'Kunden' in 'field list'


----------



## Yaslaw (6. Juni 2013)

Schau mal dein SELECT an. Das Fled heisst nicht Kunden sondern kunden_id in deiner Tabelle. (ebenfalls bei aufgabe darauf achten wie das Feld genau heisst)
Du musst schon die Feldnamen der Tabelle und nicht die Aliase irgend eines SELECTS angeben.
Dasselbe im UPDATE-Teil


```
INSERT INTO sb (
-- Hier ide ID-Felder so angeben wie sie in der DB auch heissn
    kunden_id, 
    anf_id, 
    done, 
    bw01,
    bw02,
    bw03, 
    bw04,
    bw05, 
    bw06, 
    bw07, 
    bw08, 
    bw09, 
    bw10
) VALUES (
    :Kunden,
    :Aufgaben,
    :done,
    :bw01,
    :bw02,
    :bw03,
    :bw04,
    :bw05,
    :bw06,
    :bw07,
    :bw08,
    :bw09,
    :bw10
)
ON DUPLICATE KEY UPDATE
-- Ich geh mal davon aus, dass kunden_id / anf_id der PrimaryKey ist
-- Ergo diese hier nicht mehr anrühren
    -- kunden_id = :Kunden,
    -- anf_id = :Aufgaben,
    done = :done,
    bw01 = :bw01,
    bw02 = :bw02,
    bw03 = :bw03,
    bw04 = :bw04,
    bw05 = :bw05,
    bw06 = :bw06,
    bw07 = :bw07,
    bw08 = :bw08,
    bw09 = :bw09,
    bw10 = :bw10
;
```

btw. Bitte in Zukunft deine SQLs in SQL-Tags setzen
[code=sql]INSERT INTO....;[/code]


----------



## Scuzzi (8. Juni 2013)

Hallo Yaslaw,

Ich war sehr beschäftigt und konnte mich leider noch nicht darum kümmern.
Ich danke dir sehr, dass du mich wieder auf den richtigen pfad brachtest. Ich könnte mich in den A...
beissen. Ich war schon mal an diesem punkt.

Normalerweise setze ich schon Tags, aber an diesem Tag war ich sehr spät dran. Ich werde mich daran halten.


Mal eine Grundsatzfrage...

Bin ich auf dem richtigen Weg?

Weil ich immer wieder auf neue Probleme stosse bin ich mir da nicht mehr sicher und ich möchte auch euch nicht verückt machen.

Wie würdest Du so etwas im Grundsatzt lösen?

Wie habe ich bislang gearbeitet...

Für jeden Kunden führte ich eine Datenblatt (Papier, Excel)


Anforderung  BW1 BW2  BW3  BW4  BW5 ->
1
2
3
4
|
v

Und da machte ich meine Bewertungen, schnell und einfach konnte ich in wenigen Sekunden
mehrere Anforderungen bewerten.

Kurz zu mir...
Ich wahr von 1988-2007 in der IT Branche, zuletzt in der IT-Security (Firewall, Virus blablabla)

Heute mache ich auf Coaching im Bereich des Kundendienstes und etwas im Grafischen bereich.

Mit SQL hatte ich nur zu tun, wenn wir z.B. backups zurückspielten.

Ich habe mir einige Tools von SQL Maestro gekauft und die Oberfläche erstelle ich mit ihrem Codegenerator.

Ich habe mir eine DB Apllikation gebaut die soweit rundum abgeschlossen ist, dass ich arbeiten
abrechnen usw. kann.

Für Kreativität bleibt da aber nicht viel Platz.
Wobei ich sagen muss, man hat schon enorm viel Möglichkeiten, ich lerne immer wieder was dazu und bin erstaunt wie clever die das gemacht haben.

Aber einen Kalender (Outlook Style und handling) kann er z.B. nicht. also benutze ich den vom Tablet
Muss also jede Sitzung zwei mal erfassen. (Kalender + DB). Es gibt soche Kalender im Internet also nicht die Online Kalender, sondern PHP-Kalender usw die nahe an das herankommen. für die eigene HP. Aber eben Betreff gebunden und nicht Kontakt gebunden, du verstehst was ich meine.

Im Leben ist doch jeder Termin mit einen Kontakt verbunden, niemals mit einen Betreff.
Aber in deren Code möchte ich mich nicht rein arbeiten um das anzupassen.


----------



## Scuzzi (9. Juni 2013)

So, alles funktioniert einwand frei. Keine doppelten Einträge, alles perfekt.

Musste noch den Primärschlüssel der sb Tabelle anfügen

INSERT INTO sb (
    id,
    kunden_id, 
    anf_id, 
    done, 
    bw01,
    bw02,
    bw03, 
    bw04,
    bw05, 
    bw06, 
    bw07, 
    bw08, 
    bw09, 
    bw10
) VALUES (
    :id,
    :Kunden,
    :Aufgaben,
    '1',
    :bw01,
    :bw02,
    :bw03,
    :bw04,
    :bw05,
    :bw06,
    :bw07,
    :bw08,
    :bw09,
    :bw10
)
ON DUPLICATE KEY UPDATE
    id = :id, <--------Primärschlüssel der Tabelle sb
    kunden_id = :Kunden,
    anf_id = :Aufgaben,
    done = :done,
    bw01 = :bw01,
    bw02 = :bw02,
    bw03 = :bw03,
    bw04 = :bw04,
    bw05 = :bw05,
    bw06 = :bw06,
    bw07 = :bw07,
    bw08 = :bw08,
    bw09 = :bw09,
    bw10 = :bw10;


----------



## Scuzzi (9. Juni 2013)

Ich möchte mich nochmals recht herzlich bedanken für deine Geduld.
Trotz allem habe ich viel gelernt.


----------

