2017-04-03 1 views
0

Angenommen, ich habe folgende Tabellen in MYSQLWie gleiche Tabellen mit gleichen Instanzen in MYSQL zu verbinden?

Sailors (sid,sname,rating,age) where sid-> Sailor's id, 

Reserves (sid,bid,day) where bid-> boat's id 

Meine Suche ist: -

Namen der Segler finden, die zwei verschiedene Boote am selben Tag gesegelt?

Zuerst habe ich versucht, die beiden Kopien der Reservetabelle zu verbinden und eine Bedingung hinzuzufügen, dass das Gebot anders sein muss.

SELECT * FROM reserves R1,reserves R2 WHERE R1.day = R2.day AND R1.bid <> R2.bid; 

Ich habe Ausgabe wie folgt: -

enter image description here

Nun Abfrage der names of the sailors, also für das will ich haben Segler Tisch mit dieser resultierenden Tabelle zu verbinden.


Nun, wie kann ich anwenden verbinden (Was sind die Bedingungen) Operation, um das gewünschte Ergebnis zu erhalten?

+0

Das Modell Beschreibung Ihrer beiden Tabellen verpassten ist unvollständig. Außerdem sollte Ihre Abfrage, die r1 und r2 verbindet, wahrscheinlich an '... AND R1.bid> R2.bid' teilnehmen, um Duplikate auf ungeordneten Tupeln zu vermeiden. – Sebas

+0

@Sebas Sollte ich Instanzen der Tabelle bereitstellen? – Barry

+0

Was ich meinte ist, dass es scheint, dass einige Spalten in Ihrer Definition fehlen (die Tagesspalte in Reserven zum Beispiel). Ich nehme an, wir brauchen sie für den Beitritt, sonst sehe ich nicht, wie man sich den Seglern und Reserven anschließen könnte. – Sebas

Antwort

0
drop table if exists sailors; 
drop table if exists reserves; 

create table sailors(sid int, sname varchar(3)); 
create table reserves(bid int,sid int, dt date); 

insert into sailors values 
(1,'abc'),(2,'def'),(3,'ghi'); 
insert into reserves values 
(100,1,'2017-01-01'),(200,1,'2017-01-01'), 
(100,1,'2017-01-02'),(100,1,'2017-01-02'), 
(100,2,'2017-01-01'),(100,2,'2017-01-01'),(300,2,'2017-01-01'), 
(100,2,'2017-01-03'),(200,2,'2017-01-04') 
; 

select s.sid,t.sname,s.dt 
     ,group_concat(s.bid order by s.bid) boats 
from 
(
select r.sid,r.dt,r.bid, 
     if(concat(r.sid,r.dt,r.bid) <> @p, @rn:=1,@rn:[email protected]+1) rn,  
     @p:=concat(r.sid,r.dt,r.bid) p 
from (select @rn:=0,@p:='') rn,reserves r 
order by r.sid,r.dt,r.bid 
) s 
join sailors t on t.sid = s.sid 
where s.rn = 1 
group by s.sid,s.dt 
having instr(boats,',') > 0 

+------+-------+------------+---------+ 
| sid | sname | dt   | boats | 
+------+-------+------------+---------+ 
| 1 | abc | 2017-01-01 | 100,200 | 
| 2 | def | 2017-01-01 | 100,300 | 
+------+-------+------------+---------+ 
2 rows in set (0.00 sec) 
0

Try This:

SELECT *,s.SName As SailorName 
FROM reserves R1 
INNER JOIN reserves R2 ON R1.day = R2.day AND R1.bid <> R2.bid 
INNER JOIN Sailors s ON R2.sid = s.sid 
0

Sie sollten Tisch Sailors zu FROM Klausel hinzuzufügen und Bedingung hinzu: beide Spalten sid von Tabellen Sailors und R1 gleich sind.

Diese Abfrage:

SELECT * 
FROM Reserves R1 
INNER JOIN Reserves R2 ON R1.sid=R2.sid AND R1.bid<R2.bid AND R1.date=R2.date 
INNER JOIN Sailors S ON R1.sid=S.sid 

Auch habe ich hinzugefügt notwendige Bedingung: R1.sid = R2.sid, die Sie in Ihrer Anfrage

Verwandte Themen