Relativ simpler Select

E

eXcuvator

Aktives Mitglied
Thread Starter
Dabei seit
31.05.2007
Beiträge
201
Reaktionspunkte
2
Moin, folgendes ist die Struktur:

Table A
id

Table to_A_C
id, aid, cid

Table C
id

Und nun möchte ich sämtliche Reihen von C, die noch kein zugewiesenes A haben (für ein spezielles A.id).

SELECT * FROM C
LEFT OUTER JOIN to_A_C ON C.id = to_A_C.cid
LEFT OUTER JOIN A ON A.id = to_A_C.aid

Nun fehlt mir nur noch die Begrenzung, dass ich tatsächlich nur Ergebnisse haben will, die kein A haben ... quasi das genaue gegenteil vom inner-Join.

Würde das mit WHERE A.id = null gehen? Ich hab Probleme, mir das vorzustellen, weil in Verbindung mit nem OUTER join eine Bedingung bei dem gejointen Table ja irrelevant ist ...
 
Moin, folgendes ist die Struktur:

Table A
id

Table to_A_C
id, aid, cid

Table C
id

Und nun möchte ich sämtliche Reihen von C, die noch kein zugewiesenes A haben (für ein spezielles A.id).

SELECT * FROM C
LEFT OUTER JOIN to_A_C ON C.id = to_A_C.cid
LEFT OUTER JOIN A ON A.id = to_A_C.aid

Nun fehlt mir nur noch die Begrenzung, dass ich tatsächlich nur Ergebnisse haben will, die kein A haben ... quasi das genaue gegenteil vom inner-Join.

Würde das mit WHERE A.id = null gehen? Ich hab Probleme, mir das vorzustellen, weil in Verbindung mit nem OUTER join eine Bedingung bei dem gejointen Table ja irrelevant ist ...

Hallo, mir würde spontan folgendes einfallen.

select * from C
where id not in (select cid from to_a_c where aid=<kandiat>)
 
Gut, das wäre ein erster Ansatz. Gibt es noch einen, der keine zwei Querys beinhaltet?
 
SELECT * FROM C
LEFT OUTER JOIN to_A_C ON C.id = to_A_C.cid
WHERE to_A_C.aid = NULL

So? Tabelle A muss ja nicht mit in den Select.
 
naja, ich brauch das aber für ein bestimmtes a.id

also ich will alles Cs, die es für eine bestimmte A.id noch nicht gibt .... so würde ich alle Cs kriegen, die es noch nicht gibt :D
 
Ach so... ne, da braucht man 2 Queries, da die Einschränkung a.id=<ebbes> aus dem outer join einen inner macht. Also just.do.its Lösung.
 
Klar geht das mit einem einzigen Select und Tabelle A wird dafür in der Tat nicht benötigt:

Testaufbau:
Code:
-- 
-- Tabellenstruktur für Tabelle `tabelle_a`
-- 

CREATE TABLE `tabelle_a` (
  `id` int(8) unsigned zerofill NOT NULL auto_increment,
  `name` varchar(100) NOT NULL default '',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=6 ;

-- 
-- Daten für Tabelle `tabelle_a`
-- 

INSERT INTO `tabelle_a` (`id`, `name`) VALUES (00000001, '1. Eintrag Tabelle A'),
(00000002, '2. Eintrag Tabelle A'),
(00000003, '3. Eintrag Tabelle A'),
(00000004, '4. Eintrag Tabelle A'),
(00000005, '5. Eintrag Tabelle A');

-- --------------------------------------------------------

-- 
-- Tabellenstruktur für Tabelle `tabelle_a_c`
-- 

CREATE TABLE `tabelle_a_c` (
  `id_c` int(8) unsigned zerofill NOT NULL default '00000000',
  `id_a` int(8) unsigned zerofill NOT NULL default '00000000',
  PRIMARY KEY  (`id_c`,`id_a`)
) TYPE=MyISAM;

-- 
-- Daten für Tabelle `tabelle_a_c`
-- 

INSERT INTO `tabelle_a_c` (`id_c`, `id_a`) VALUES (00000001, 00000001),
(00000001, 00000002),
(00000003, 00000001),
(00000004, 00000001),
(00000005, 00000002);

-- --------------------------------------------------------

-- 
-- Tabellenstruktur für Tabelle `tabelle_c`
-- 

CREATE TABLE `tabelle_c` (
  `id` int(8) unsigned zerofill NOT NULL auto_increment,
  `name` varchar(100) NOT NULL default '',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=6 ;

-- 
-- Daten für Tabelle `tabelle_c`
-- 

INSERT INTO `tabelle_c` (`id`, `name`) VALUES (00000001, '1. Eintrag Tabelle C'),
(00000002, '2. Eintrag Tabelle C'),
(00000003, '3. Eintrag Tabelle C'),
(00000004, '4. Eintrag Tabelle C'),
(00000005, '5. Eintrag Tabelle C');

Alle C, die es für a.id = 1 noch nicht gibt:
Code:
SELECT C.* FROM tabelle_c C LEFT OUTER JOIN tabelle_a_c to_A_C ON C.id = to_A_C.id_c && to_A_C.id_a = 1 where isnull(to_A_C.id_a)

Code:
+----------+----------------------+
| id       | name                 |
+----------+----------------------+
| 00000002 | 2. Eintrag Tabelle C |
| 00000005 | 5. Eintrag Tabelle C |
+----------+----------------------+

Alle C, die es für a.id = 2 noch nicht gibt:
Code:
SELECT C.* FROM tabelle_c C LEFT OUTER JOIN tabelle_a_c to_A_C ON C.id = to_A_C.id_c && to_A_C.id_a = 2 where isnull(to_A_C.id_a)

Code:
+----------+----------------------+
| id       | name                 |
+----------+----------------------+
| 00000002 | 2. Eintrag Tabelle C |
| 00000003 | 3. Eintrag Tabelle C |
| 00000004 | 4. Eintrag Tabelle C |
+----------+----------------------+

Alle C, die es für a.id = 3 noch nicht gibt:
Code:
SELECT C.* FROM tabelle_c C LEFT OUTER JOIN tabelle_a_c to_A_C ON C.id = to_A_C.id_c && to_A_C.id_a = 3 where isnull(to_A_C.id_a)

Code:
+----------+----------------------+
| id       | name                 |
+----------+----------------------+
| 00000001 | 1. Eintrag Tabelle C |
| 00000002 | 2. Eintrag Tabelle C |
| 00000003 | 3. Eintrag Tabelle C |
| 00000004 | 4. Eintrag Tabelle C |
| 00000005 | 5. Eintrag Tabelle C |
+----------+----------------------+

usw.

Matt
 
Zurück
Oben Unten