2016-07-22 11 views
1

Ich habe 3 Tabellen event1, event2, event2, die alle Benutzer enthält, die an dem Ereignis teilgenommen haben. Jede Tabelle hat fast Millionen Daten. Diese Tabellen nehmen mit neuen Ereignissen weiter zu.Join Mehrere Tabellen mit Zeilenwert

Ich habe einen Kunden-Tabelle, die alle Kunden der Veranstaltung den Kunden Detail

Event1 
+------+------------+---------+ 
| id | phone  | details | 
+------+------------+---------+ 
| 1 | 1234567890 | Detail1 | 
| 2 | 2345678901 | Detail2 | 
| 3 | 3456789012 | Detail3 | 
+------+------------+---------+ 

Event 2 
+------+------------+---------+ 
| id | phone  | details | 
+------+------------+---------+ 
| 1 | 1234567890 | Detail1 | 
| 2 | 2345678901 | Detail2 | 
| 3 | 3456789012 | Detail3 | 
+------+------------+---------+ 

Event 3 
+------+------------+---------+ 
| id | phone  | details | 
+------+------------+---------+ 
| 1 | 1234567890 | Detail1 | 
| 2 | 2345678901 | Detail2 | 
| 3 | 3456789012 | Detail3 | 
+------+------------+---------+ 

Customer 
+------+------------+--------------+ 
| id | phone  | event_name | 
+------+------------+--------------+ 
| 1 | 1234567890 | event1  | 
| 2 | 456789| event2  | 
| 3 | 789| event3  | 
+------+------------+--------------+ 

i-Schleife für 3 Tabellen durch diese Abfrage

SELECT cu.*,c.* FROM customer cu JOIN event1 c WHERE cu.phone=c.phone 


SELECT cu.*,c.* FROM customer cu JOIN event2 c WHERE cu.phone=c.phone 


SELECT cu.*,c.* FROM customer cu JOIN event3 c WHERE cu.phone=c.phone 

http://sqlfiddle.com/#!9/1c8bf/2

haben zu holen hält

Wie kann dies in einer einzelnen Abfrage getan werden. Ich spare Tabellennamen für jeden Kunden.

Antwort

0
SELECT cu.*,c.* FROM customer cu JOIN event1 c WHERE cu.phone=c.phone 
UNION 
SELECT cu.*,c.* FROM customer cu JOIN event2 c WHERE cu.phone=c.phone 
UNION 
SELECT cu.*,c.* FROM customer cu JOIN event3 c WHERE cu.phone=c.phone 

Sie Ihren Such von mehreren Abfragen kombinieren können durch UNION

Fiddle

Adjusted the answer of Prashant:

Verwendung Als Prashan zeigt, Sie dynamischen SQL verwenden können Sie Ihre Abfrage-Strings zu bauen und zu verbinden. Wenn Sie dann das ";" in den resultierenden Strings mit "UNION" und führen Sie direkt die Zeichenfolge aus, erhalten Sie Ihre Ergebnismenge (Sie müssen auch eine Sitzungsvariable verwenden, um die Abfragezeichenfolge ausführen zu können). Fiddle

CREATE PROCEDURE `SP_GetAll`() 
BEGIN 
declare done int; 
DECLARE table_name VARCHAR(255) ; 
DECLARE str VARCHAR(1000) ; -- attention: value must be high enough to contain the whole query, so you have to estimate the string length 

DECLARE cursor_name CURSOR FOR 
select event_name from customer; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 
SET @str=''; 
SET done = 0 ; 
    OPEN cursor_name; 
read_loop: LOOP 
FETCH cursor_name INTO table_name; 

IF done=1 THEN 
     LEAVE read_loop; 
    END IF; 
SET @str=CONCAT(@str, ';SELECT cu.*,c.* FROM customer cu JOIN ', table_name ,' c on cu.phone=c.phone'); 

    END LOOP; 

    SET @str = SUBSTRING(@str, 2); 
    SET @str = REPLACE(@str, ";", " UNION "); 

    PREPARE QUERY FROM @str; 
    EXECUTE QUERY; 
    CLOSE cursor_name; 
END// 
+0

Es kann n Anzahl des Ereignis tabes – Manish

1

Sie können mehrere Tabellen beitreten

SELECT * 
    FROM customers cu 
     LEFT JOIN event1 e1 
       ON e1.phone = cu.phone 
     LEFT JOIN event2 e2 
       ON e2.phone = cu.phone 
     LEFT JOIN event3 
       ON e3.phone = cu.phone; 

EDIT: LEFT JOIN statt INNER wird verwendet, JOIN, weil ein Kunde mit entweder Ereignis 1 oder Ereignis 2 oder Ereignis 3 oder nicht notwendigerweise in Verbindung gebracht werden kann jeder von ihnen. Der linke Join würde dann einen NULL für Werte eines Ereignisses ergeben, zu dem der Kunde nicht gehört, und somit das gewünschte Ergebnis zurückgeben. Für jeden Kunden werden die Listenereignisse, mit denen er verknüpft ist und die nicht unbedingt mit allen verknüpft sind, als Datensatz zurückgegeben.

+0

Ich würde total abstimmen diese Antwort sein, wenn es eine Erklärung, warum 'LEFT JOIN' ist. – Will

+0

Nun, OPs Frage will Zeilen hinzufügen, nicht Spalten (er hat 3 Abfragen, will sie zu 1). Der schwierige Teil ist jedoch, dass es eine variable Anzahl von Ereignistabellen gibt, so dass Sie eine Prozedur verwenden müssen, um zuerst die richtige Abfrage zu generieren und sie dann auszuführen. – Philipp

1

Dies kann mithilfe von Cursorn erreicht werden, um diese Abfragen dynamisch zu generieren.

DROP PROCEDURE IF EXISTS `SP_GetAll`// 

CREATE PROCEDURE `SP_GetAll` 
( 
) 
BEGIN 
declare done int; 
DECLARE table_name  VARCHAR(255) ; 
DECLARE str  VARCHAR(255) ; 

DECLARE cursor_name CURSOR FOR 
select event_name from customer; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 
SET str:=''; 
SET done = 0 ; 
    OPEN cursor_name; 
read_loop: LOOP 
FETCH cursor_name INTO table_name; 

IF done=1 THEN 
     LEAVE read_loop; 
    END IF; 
SET str=CONCAT(str, 'SELECT cu.*,c.* FROM customer cu JOIN ', 
       table_name ,' c on cu.phone=c.phone;'); 


    END LOOP; 
    select str; //this can be changed to direct execution if needed 
    CLOSE cursor_name; 
END// 

Diese sp ausführen CALL SP_GetAll(); resultierende dynamische Abfrage würde wie folgt aussehen ..

SELECT cu.*,c.* FROM customer cu JOIN event1 c on cu.phone=c.phone;SELECT cu.*,c.* FROM customer cu JOIN event2 c on cu.phone=c.phone;SELECT cu.*,c.* FROM customer cu JOIN event3 c on cu.phone=c.phone; 
+0

Geige hier -> http://www.sqlfiddle.com/#!9/874d4/1 –