2016-06-21 4 views
3

Ich habe zwei Tabellen Platz und Post, die ich brauche, um einen Ausgangmysql - Join-Tabellen basierend auf mehreren Spalten in der zweiten

place 
-------------- 
std_id sch_id 
1  1 
2  2 
3  1 
4  3 
5  4 
6  2 
7  5 
8  3 
9  5 
10  4 

und

Post 
------------ 
sch1_id sch2_id sch3_id sup_id 
1  2  3  1 
3  2  4  2 

ich die folgende Ausgabe zu erzeugen, müssen erzeugen

sup_id sch_id std_id 
1  1  1 
1  1  3 
1  2  2 
1  2  6 
1  3  4 
1  3  8 
2  3  4 
2  3  8 
2  2  2 
2  2  6 
2  4  5 
2  4  10 

ich habe versucht, diese

SELECT pl.std_id,po.sup_id FROM `place` pl,`post` po WHERE pl.sch_id = 
po.sch1_id group by po.sup_id 

und erhielt diese

| std_id | sup_id | 
|--------|--------| 
|  1 |  1 | 
|  4 |  2 | 

EDIT

SQLFiddle

+0

Erste normalisieren Ihr Design. Jedes Mal, wenn Sie sich mit aufgezählten Spalten (über "2" sagen, sagen) Alarmglocken sollten klingeln – Strawberry

+0

wie könnte dies normalisiert werden, irgendwelche Vorschläge? – Smith

+1

'Post (sup_id *, sch_number *, sch_id)' * = Komponente von PRIMARY KEY – Strawberry

Antwort

3

uns einfach IN() e:

SELECT pl.std_id,pl.sch_id,po.sup_id 
FROM `place` pl 
INNER JOIN `post` po 
ON(pl.sch_id IN(po.sch1_id,po.sch2_id,po.sch3_id)) 

Keine Notwendigkeit, Ihre Daten zu normalisieren, obwohl es sehr zu empfehlen !! Sie sollten über Ihre Tabellenstruktur nachdenken.

2

können Sie versuchen, 'un-Schwenktisch postUNION ALL mit:

SELECT pl.std_id, po.sch_id, po.sup_id 
FROM `place` pl 
JOIN (
    SELECT sch1_id AS sch_id, sup_id 
    FROM `post` 

    UNION ALL 

    SELECT sch2_id AS sch_id, sup_id 
    FROM `post` 

    UNION ALL 

    SELECT sch3_id AS sch_id, sup_id 
    FROM `post` 

    UNION ALL 

    SELECT sch4_id AS sch_id, sup_id 
    FROM `post` 
) AS po ON pl.sch_id = po.sch_id 
+0

[Fiddler] (http://rextester.com/OQF28072) für das gleiche. – Arulkumar

3

Es sieht aus wie Sie die Verbindung eine der passenden sch * Werte bilden wollen, Wenn ja, dann ein Weg, um mehrere Bedingungen in der Verknüpfung zu verwenden wäre:

select sup_id, sch_id, std_id 
from post p 
join place pl on pl.sch_id = p.sch1_id 
       or pl.sch_id = p.sch2_id 
       or pl.sch_id = p.sch3_id 
+0

Dies ist ineffizient. – sagi

+0

@sagi Es könnte ineffizient sein, aber zumindest gibt es die gewünschte Ausgabe ... In SQL Fiddle unsere beiden Abfragen hat jedoch den gleichen Ausführungsplan (wie zu erwarten). – jpw

+0

@sagi warum haben Sie gesagt, dass es ineffizient ist? – Smith