Archiv verlassen und diese Seite im Standarddesign anzeigen : SQL mit Count(*)
Hallo, ich habe folgendes Problem:
Zwei Tabellen, in der einen stehen die Autoren und in der anderen die Titel mit der Zurodnung zum Autor:
T1: AID; Autor; Anzahl
T2: TID; Titel; AID
Nachdem alles eingefügt ist, möchte ich in die T1 jeweils die Anzahl der
Titel abspeichern, die zum jeweiligen Autor passen:
Die SQL-Abfrage für die einzelne AID wäre:
SELECT titel, count(*) as anzahl FROM T2 WHERE AID ='10'
Jetzt möchte ich, dass die Anzahl für jede AID zu der jeweiligen AID in die Tabelle T1 geschrieben wird.
Ich dachte, dass die wie folgt gehen müsste:
UPDATE T1 SET Anzahl = (SELECT Count(*) FROM T2
WHERE INNER JOIN T2 ON T1.AID = T2.AID)
WHERE INNER JOIN T2 ON T1.AID = T2.AID;
Würde mich freuen, wenn mir jemand helfen würde oder einen Hinweis auf die Lösung geben könnte.
Vielen Dank im Vorraus
flo
Ich dachte, dass die wie folgt gehen müsste:aber?
SELECT
autor.id,
COUNT(artikel.id) num
from
autor
LEFT JOIN artikel ON autor.id = artikel.autor_id
GROUP BY
autor.id
müsste die schonmal die anzahlen liefern...
Ja, die Countabfrage geht, auch wenn sie auf meinem Rechner etwas schwerfällig ist bei folgender DB-Grösse: Autor: 3000 und Titel: 14000
Auf dem Rechner habe ich aber ne DB mit ca. 60.000 Autoren und 1.090.000 Titeln. Da wird mir der Rechner abstürzen, kann ich da mit LIMIT arbeiten?
Aber zunächst wäre toll, wenn jemand mir bei der Updateanweisung helfen könnte...
... ich wer es natürlich auch versuchen.
Auf dem Rechner habe ich aber ne DB mit ca. 60.000 Autoren und 1.090.000 Titeln. Da wird mir der Rechner abstürzen, kann ich da mit LIMIT arbeiten? mit limit würdest du automatisch den zähler (count()) beschränken.
ghostgambler 25-03-2007, 21:24 mach mal ein
EXPLAIN SELECT
autor.id,
COUNT(artikel.id) num
from
autor
LEFT JOIN artikel ON autor.id = artikel.autor_id
GROUP BY
autor.id
und poste das result-triple
Explain Abfrage:
table type possible_keys key key_len ref rows Extra
autor index NULL PRIMARY 4 NULL 61628 Using index; Using temporary
artikel ALL NULL NULL NULL NULL 1091139
ghostgambler 26-03-2007, 12:36 Original geschrieben von flo
Explain Abfrage:
table type possible_keys key key_len ref rows Extra
autor index NULL PRIMARY 4 NULL 61628 Using index; Using temporary
artikel ALL NULL NULL NULL NULL 1091139
Kein Wunder, dass der Query langsam ist ... du weißt was Indizes sind und wofür sie gut sind?! ... Wenn nicht solltest du mal schnell zu Google rennen und dein Wissen diesbezüglich aufpolieren oO
Ja mit indexierung hat jetzt zumindest ein insert in eine hilfstabelle geklapt.
Ich möchte aber die bestehende tabelle updaten:
UPDATE autoren
SET anzahl = (SELECT anzahl from autoren
LEFT JOIN autorenhilfstb ON autoren.aid = autorenhilfstb.aid)
LEFT JOIN autorenhilfstb ON autoren.aid = autorenhilfstb.aid;
wenn ich allein den Select ausdruck mit explain abfrage, erhalte ich folgendes ergebnis:
Column: 'anzahl' in field list is ambiguous
In der Tabelle autoren ist die Spalte anzahl leer und in der
Hilfstabelle sind jetzt bereits die gezählten ergebnisse. Via Insert hätte ich aus den beiden Tabellen ja eine neue Tabelle erstellen können, in der alle Parameter schon stehen würden, damit müsste ich bei neuen Datn aber immer eine neue Tabelle ertellen, dabei würden die bestehenden Daten evtl. einen neuen Primärschlüssel bekommen, was nicht in meinem sinne ist.
Original geschrieben von flo
wenn ich allein den Select ausdruck mit explain abfrage, erhalte ich folgendes ergebnis:
Column: 'anzahl' in field list is ambiguous
Und das hast du dir natürlich mal übersetzen lassen.
ja, ich versteh schon dass anzahl nicht eindeutig ist,
ich will aber nur die "anzahl" hinzufügen.
Ich hab eine Tabelle id, name, anzahl wobei die spalte anzahl leer ist
und die zweite id, anzahl
jetzt würde ich am liebsten.
update t1 set anzahl = t2.anzahl
where t1.id = t2.id
Laut buch müsste auch gehen:
update t1 left join t2 ON (t1.id=t2.id)
set t1.Spalte = Wert Where t2. Spalte = Wert;
daraus könnte ich doch machen:
update t1 left join t2 ON (t1.id=t2.id)
set t1.Spalte = t2.Spalte Where t2. id = t1.id;
Ich versteh es nicht
mrhappiness 26-03-2007, 13:51 ambigous = Es gibt mehrere Tabellen mit einer Spalte "anzahl"
Lösung: Sage der Datenbank, welche anzahl du haben willst
Syntax. tabellenname.spaltenname
Ich hab jetzt auf dem Rechner MySQL 3.23.47-max-debug auf localhost als root@localhost
Kann sein, dass das ganze auf meinem Rechner nicht funktioniert.
Im Markt und Technick Buch steht jetzt, dass ab der Version 4 man mit dem
Update-Befehl mehrere Tabellen einbinden kann?
ich will aber nur die "anzahl" hinzufügen. Welche??? Wie wahsaga schon sagte. es gibt mehrere. Woher soll MySQL (egal welche version) wissen, welche du meinst?
Vielleicht bin ich zu doof, aber die Select-Abfrage geht jetzt und liefert
das richtige ergebnis:
SELECT autorenhilfstb.anzahl from autorenhilfstb
LEFT JOIN autoren ON autoren.id = autorenhilfstb.id
Das hier liefert einen Fehler:
Update autoren SET autoren.anzahl = (SELECT autorenhilfstb.anzahl from autorenhilfstb
LEFT JOIN autoren ON autoren.id = autorenhilfstb.id)
LEFT JOIN autorenhilfstb ON autoren.id = autorenhilfstb.id;
Fehler:
You have an error in your SQL syntax near 'SELECT autorenhilfstb.anzahl from autorenhilfstb
LEFT JOIN autoren ' at line 1
:(
Original geschrieben von flo
Update autoren SET autoren.anzahl = (SELECT autorenhilfstb.anzahl from autorenhilfstb
LEFT JOIN autoren ON autoren.id = autorenhilfstb.id)
LEFT JOIN autorenhilfstb ON autoren.id = autorenhilfstb.id;
Was genau bezweckst du denn bitte mit dieser Klammersetzung ...?
Hirn einschalten, überlegen - was steht da jetzt eigentlich?
UPDATE tabelle SET spalte = (...wert...)
LEFT JOIN ...
Ergibt es deiner Ansicht nach irgendeinen Sinn, UPDATE mit LEFT JOIN zu kombinieren?
Falls ja, sind wir gespannt, welcher das sein sollte.
Die Klammer habe ich so aus dem Buch "jetzt lerne ich PHP 5 & MySQL 4.1 von Markt und Technik.
Was ich bezwecke?
http://www.sql-und-xml.de/sql-tutorial/update-aktualisieren-der-zeilen.html
Update einer Tabelle mit JOIN (ANSI, Ms-SqlServer)
UPDATE <Tabelle | View>
SET <Name einer Spalte> = <Ausdruck aus Spalten,
Konstanten, Funktionen>
[, weitere Spaltennamen = Ausdruck]
[FROM <Tabelle> [INNER | LEFT | RIGHT] JOIN <Tabelle>
ON <Spalte-1 = Spalte-2>]
WHERE <Bedingung>
Tabelle1 und Tabelle2
In der ersten habe ich eine ID als Primärschlüssel, einen Namen und eine Spalte "anzahl". In der Tabelle 2 habe ich dieselbe ID und die eine numerische Anzahl.
Jetzt möchte ich aus den Tabelle 2 die Numerische Zahl in die Tabelle1 reinschreiben und zwar dort, wo die IDS übereinstimmen. Um beide Tabellen anzusprechen brauche ich Joins.
Meinem verständnis nach:
UPDATE t1 SET t1.anzahl = (Wert aus einer anderen Tabelle wo t1.id=t2.id)
Where (Bedingung unter der in die t1 in die spalte anzahl etwas geschrieben wird, also where INNER JOIN t2 ON t1.id=t2.id)
Auch wenn die innere SQL-Abfrage funktioniert, so funktioniert das gesamte Update-Befehl nicht.
Deshalb bitte ich um Hilfe. Ich kenne mich nun mal nicht so aus, dass ich auf die Lösung von allein kommen könnte, trotz Ihrer Hinweise.
ghostgambler 26-03-2007, 18:34 Original geschrieben von flo
Was ich bezwecke?
http://www.sql-und-xml.de/sql-tutorial/update-aktualisieren-der-zeilen.html
na man sollte sich nicht an irgendwelchen "allgemeingültigen" Tutorials vergreifen, wo man doch weiß, dass praktisch kein DBMS die Standards wirklich 100%tig innehält~
http://dev.mysql.com/doc/refman/5.1/en/update.html
:{ :( Ihr acht es mir nicht leicht.
Bin da auch gelandet, hab dann dies probiert:
You can also perform UPDATE operations covering multiple tables. However, you cannot use ORDER BY or LIMIT with a multiple-table UPDATE. The table_references clause lists the tables involved in the join. Its syntax is described in Section 13.2.7.1, “JOIN Syntax”. Here is an example:
UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;
Update autoren, artikel Set autoren.anzahl=artikel.anzahl
WHERE autoren.id=artikel.id;
Ausgabe:
You have an error in your SQL syntax near ' artikel Set autor.anzahl=artikel.anzahl
Es wäre für mich schon wichtig, das mit dem Update richtig zu können, es ist nämlich umständlich immer via Insert-Befehl bei jedem zusätzlichem Furz ne neue Tabelle zu erstallen. :(
onemorenerd 26-03-2007, 21:12 In der Fehlermeldung steht autor.anzahl, in der Query autoren.
Original geschrieben von flo
Es wäre für mich schon wichtig, das mit dem Update richtig zu können, es ist nämlich umständlich immer via Insert-Befehl bei jedem zusätzlichem Furz ne neue Tabelle zu erstallen. :(
... und warum postet du nicht die Abfrage von deinem Code sondern immer eine andere. Zum Glück sagt die Fehlermeldung schon eindeutig, waran es lag :teach:
CREATE TABLE t2 (
iid int(11) NOT NULL default '0',
anzahl int(5) NOT NULL default '0',
PRIMARY KEY (iid),
KEY iid (iid)
) TYPE=MyISAM;
CREATE TABLE t3 (
autor varchar(255) NOT NULL default '',
iid int(11) NOT NULL auto_increment,
anzahl int(5) NOT NULL default '0',
PRIMARY KEY (iid),
UNIQUE KEY iid (iid)
) TYPE=MyISAM;
Diese Abfrage funktioniert:
SELECT t2.anzahl from t2 LEFT JOIN t3 ON t3.iid = t2.iid
Fehler
SQL-Befehl :
Update t3 set t3.anzahl = SELECT t2.anzahl from t2 LEFT JOIN t3 ON t3.iid = t2.iid
inner join t2 ON t3.iid = t2.iid
MySQL meldet:
You have an error in your SQL syntax near 'SELECT t2.anzahl from t2 LEFT JOIN t3 ON t3.iid = t2.iid
inner join t2 ON t3.i' at line 1
Ich weiß nicht, wie ich es machen soll, freue mich auf die Hilfe von euch.
sag' mal was denkst du dir denn dabei? überlege doch mal wieviele Werte man bei update... set bla = ... einsetzen darf, und wieviele Werte select... liefert?
Oh mann, lasse lieber die Finger von Programmieren und verschone die Welt mit deinem Erzeugnis :rolleyes:
Mit Select will ich alle Datensätze, die zusammenpassen ausgeben. Mit Update möchte ich in die Tabelle t3 die Spalte aus t2 einfügen. In beiden Tabellen sind genau so viele Datensätze. Ich denke, dass es gehen müsste egal wieviele Datensätze in den Tabellen vorhanden sind.
Mit MS Access würde die funktionierende Abfrage wie folgt aussehen:
UPDATE T2 INNER JOIN T3 ON T2.iid = T3.iid SET T3.anzahl = [t2].[anzahl];
So falsch kann es net sein ...
Vielleicht kann mir doch jemand helfen.
Ich hab ja zwei Tabellen:
t2: iid, name, anzahl
t3: iid, name, anzahl
In beiden Tabellen sind genau so viele Datensätze
Ich möchte, dass das Feld anzahl aus der Tabelle t3 herausgelesen wird und in die Tabelle t2 hineingeschrieben wird.
Ich habe jetz mit heidisql den folgenden Fehler:
SHOW COLUMNS FROM `t3`
SHOW KEYS FROM `t3`
SELECT t2.anzahl from t2 LEFT JOIN t3 ON t3.iid = t2.iid
SHOW TABLES LIKE 't2'
SHOW COLUMNS FROM `t2` LIKE '%'
Update t3 set t3.anzahl = SELECT t2.anzahl from t2 LEFT JOIN t3 ON t3.iid = t2.iid
/* SQL Error: You have an error in your SQL syntax near 'SELECT t2.anzahl from t2 LEFT JOIN t3 ON t3.iid = t2.iid ' at line 1 */
Allein der Select Befehl wird korrekt ausgeführt, nur der Updatevorgang mit dem select befehl zusammen nicht.
Ich bin einfach ratlos.
UPDATE
t1
SET t1.feld = t2.feld
JOIN t2
ON t2.id = t1.id
(nicht getestet)
Aus http://dev.mysql.com/doc/refman/5.0/en/update.html:
Currently, you cannot update a table and select from the same table in a subquery.
|
-
- |