php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 01.09.2009, 12:42  
kip
Neuer Benutzer
 
Registriert seit: 29.03.2009
Beiträge: 14
PHP-Kenntnisse:
Fortgeschritten
kip befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] INSERT ... SELECT - nicht alle Spalten aus dem Select benutzen?

Hallo,

ich habe folgende schon recht komplexe MySQL Abfrage:

PHP-Code:
SELECT
    p
.apidm.kid
    
GROUP_CONCAT(ptag.tid) AS ptids,
    
GROUP_CONCAT(DISTINCT(mtag.tid)) AS mtids
FROM 
    
(person AS p LEFT JOIN taglink AS ptag ON (ptag.otab='person' AND ptag.oid p.apid))
    
JOIN pmlink AS link ON(p.apid link.apid
    
JOIN 
        
(master AS m LEFT JOIN taglink AS mtag ON(mtag.otab='master' AND mtag.oid m.kid))
    
ON(link.kid=m.kid)
GROUP BY
    p
.apidm.kid
HAVING 
(ptids != OR ptids IS NULL)
     AND (
ptids != OR ptids IS NULL)
    AND (
mtids != OR mtids IS NULL
Der HAVING-Teil wird durch User-Eingaben generiert und kann sich ändern. Ich möchte jetzt einfach alle Selektierten apids und kids in einer neuen Tabelle Speichern. Natürlich könnte ich jetzt alle Daten über PHP auslesen und neu speichern - aber MySQL hat ja eigentl. eine INSERT ... SELECT Funktion die hier passend und vorallen deutlich schneller wäre:

PHP-Code:
INSERT INTO sellink (selidapidkid)
SELECT
    1 
AS selid,
    
p.apidm.kid
    
GROUP_CONCAT(ptag.tid) AS ptids,
    
GROUP_CONCAT(DISTINCT(mtag.tid)) AS mtids
FROM 
    
(person AS p LEFT JOIN taglink AS ptag ON (ptag.otab='person' AND ptag.oid p.apid))
    
JOIN pmlink AS link ON(p.apid link.apid
    
JOIN 
        
(master AS m LEFT JOIN taglink AS mtag ON(mtag.otab='master' AND mtag.oid m.kid))
    
ON(link.kid=m.kid)
GROUP BY
    p
.apidm.kid
HAVING 
(ptids != OR ptids IS NULL)
     AND (
ptids != OR ptids IS NULL)
    AND (
mtids != OR mtids IS NULL
Dieses Query schlägt fehl - weil die Anzahl der Spalten aus dem INSERT nicht mit den Spalten aus dem SELECT übereinstimmen. Jemand eine Idee wie ich das lösen kann ohne die zwei extra Spalten in meiner Zieltabelle anzulegen?

Geändert von kip (01.09.2009 um 13:10 Uhr). Grund: Erledigt!
kip ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 01.09.2009, 12:46  
Erfahrener Benutzer
 
Registriert seit: 28.03.2008
Beiträge: 1.847
HPR1974 wird schon bald berühmt werden
Standard

ja das query ändern dass Du der datenfetch nur die daten beinhaltet, die in die zieltabelle kommen
HPR1974 ist offline   Mit Zitat antworten
Alt 01.09.2009, 12:51  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Geht sicher noch anders, aber ein Subselect wäre eine Möglichkeit:

Code:
INSERT INTO sellink (selid, apid, kid)
SELECT InsertData.selid , 
       InsertData.apid  , 
       InsertData.kid
FROM   (
       SELECT
           1 AS selid,
           p.apid, m.kid, 
           GROUP_CONCAT(ptag.tid) AS ptids,
           GROUP_CONCAT(DISTINCT(mtag.tid)) AS mtids
       FROM 
           (person AS p LEFT JOIN taglink AS ptag ON (ptag.otab='person' AND ptag.oid = p.apid))
           JOIN pmlink AS link ON(p.apid = link.apid) 
           JOIN (master AS m LEFT JOIN taglink AS mtag ON(mtag.otab='master' AND mtag.oid = m.kid))
             ON link.kid=m.kid
       GROUP BY
           p.apid, m.kid
       HAVING  (ptids != 1 OR ptids IS NULL)
           AND (ptids != 2 OR ptids IS NULL)
           AND (mtids != 2 OR mtids IS NULL)
       ) AS InsertData
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 01.09.2009, 12:59  
kip
Neuer Benutzer
 
Registriert seit: 29.03.2009
Beiträge: 14
PHP-Kenntnisse:
Fortgeschritten
kip befindet sich auf einem aufstrebenden Ast
Standard

hi,

danke für eure schnellen Antworten - manchmal sieht man den Wald vor lauter Bäumen einfach nicht. Ihr habt mich jetzt durch eure Antworten auf folgende Lösung gebracht:

PHP-Code:
INSERT INTO sellink (selidapidkid)
SELECT
    10 
AS selid,
    
p.apidm.kid
FROM 
    
(person AS p LEFT JOIN taglink AS ptag ON (ptag.otab='person' AND ptag.oid p.apid))
    
JOIN pmlink AS link ON(p.apid link.apid
    
JOIN 
        
(master AS m LEFT JOIN taglink AS mtag ON(mtag.otab='master' AND mtag.oid m.kid))
    
ON(link.kid=m.kid)
GROUP BY
    p
.apidm.kid
HAVING 
    
(1 NOT IN(GROUP_CONCAT(ptag.tid)) OR GROUP_CONCAT(ptag.tidIS NULL)
    AND (
2 NOT IN(GROUP_CONCAT(ptag.tid)) OR GROUP_CONCAT(ptag.tidIS NULL)
    AND (
2 NOT IN(GROUP_CONCAT(mtag.tid)) OR GROUP_CONCAT(mtag.tidIS NULL
Ich hätte erst gedacht die Abfrage ist deutlich langsamer, da ich mehrmals den GROUP_CONCAT Aggregator nutze, aber MySQL cached das wohl 1a - die Abfrage ist genauso schnell wie vorher ... obwohl sogar noch ~5000 Zeilen in die andere Tabelle kopiert werden - perfekt! Danke euch! =)
kip ist offline   Mit Zitat antworten
Alt 01.09.2009, 13:06  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Genau, das ist die andere Lösung. Du könntest alternative auch das CONCAT in eine Variable laufen lassen.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch 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
[Erledigt] 2 Spalten in Schleife als insert fulltilt PHP Tipps 2009 13 11.03.2009 19:29
[Erledigt] INSERT INTO mit SELECT Wolla Datenbanken 2 20.11.2008 12:37
[Erledigt] Mysql Insert Select + Concat Hu5eL Datenbanken 14 10.06.2008 10:39
Pathfinding Algorithmus optimieren? (Algorith. von Dijkstra) Martin13 PHP Tipps 2007 19 04.09.2007 19:20
Differenz zwischen 2 Zahlen duderino PHP Tipps 2006 19 10.08.2006 22:12
INSERT syntax - gibt es die möglichkeit VALUES und SELECT zu PermanetMarker Datenbanken 8 06.07.2006 12:48
insert select Datenbanken 15 03.01.2006 15:46
PRoblem mit Cookie bei PHPbb-Board PHP Tipps 2007 8 12.12.2005 20:56
2 Mysql Abfragen: select und insert gleichzeitig??? Datenbanken 12 14.09.2005 14:18
SELECT spalten FROM tabelle; (Datenausgabe) GrU3nL!nG Datenbanken 5 30.06.2005 17:00
mysql dump einspielen (ohne phpmyadmin) PHP Tipps 2005-2 6 18.06.2005 21:50
[Erledigt] fehler den ich noch nie gesehen habe Datenbanken 7 09.06.2005 14:29
[Erledigt] INSERT INTO SELECT an mehrere Tabellen? Datenbanken 6 17.09.2004 16:57
[Erledigt] 2 mal select 1 form PHP-Fortgeschrittene 1 01.09.2004 20:13
HILFE: Column count doesn't match value count at row 1 Datenbanken 17 12.06.2004 16:45

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
http://www.php.de/datenbanken/58635-erledigt-insert-select-nicht-alle-spalten-aus-dem-select-benutzen.html, insert distinct, insert select join, mysql insert nicht alle spalten, insert in nicht alle spalten, select insert into mehrmal, insert php mysql nicht alle spalten, select spalten, insert into join left, insert into select, insert select spalten, insert into select link, insert with select, insert select, mysql abfrage aus einer spalte mit insert into neue tabelle mehrer spalten, sql insert select mehrere zeilen, insert join, insert into join abfrage, select in insert für eine spalte, group_concat is null

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