[MySQL] crosstable select, welke join?

Pagina: 1
Acties:

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 12-02 15:52
Tabelopmaak:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Tabel relations:
+----------+-----------------------+----------------+
| Field    | Type           | Extra     |
+----------+-----------------------+----------------+
| rid   | smallint(5) unsigned  | auto_increment |
| lid   | smallint(5) unsigned  |           |
| uid   | smallint(5) unsigned  |           |
+----------+-----------------------+----------------+

Tabel logins:
+----------+----------------------+----------------+
| Field    | Type            | Extra        |
+----------+----------------------+----------------+
| lid   | smallint(5) unsigned | auto_increment |
| level    | tinyint(2) unsigned  |         |
+----------+----------------------+----------------+

Tabel users:
+----------+----------------------+----------------+
| Field    | Type            | Extra        |
+----------+----------------------+----------------+
| uid   | smallint(5) unsigned | auto_increment |
| dispname | varchar(255)      |            |
+----------+----------------------+----------------+

Owkeey.. Wat ik heb: een lid en een uid. Ik wil een relatie tussen die 2 aanleggen in de tabel relations, maar alleen als die relatie nog niet bestaat. 2 andere voorwaarden: logins.level moet kleiner zijn dan 20 (dus er moet 1 record in logins zitten met de goede lid EN een laag level (<20)), én er moet 1 record in de tabel users zitten met de goeie uid.

Wat ik nu heb is ongeveer dit:
select lid from logins where level < 20 and lid = xx;
als er 1 result is, ga door, anders quit
select uid from users where uid = xx;
als er 1 result is, ga door, anders quit
select rid from relations where uid = xx and lid = xx;
als er 0 results zijn, ga door, anders quit
insert into relations (lid, uid) values (xx, xx);

Ik breek er me nek over :r Ik héb zo het gevoel dat dit met een of andere join kan, maar kennerlijk maak ik die draai in mijn hoofd niet dat ik erachter kom. Kan iemand een tip geven? :)

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 12-02 15:52
Ik ben nog steeds hard aan het proberen in mijn ssh-loginnetje :9

select u.uid, l.lid, count(r.rid) from users u, logins l left join relations r on r.lid = l.lid and r.uid = u.uid where u.uid = 12 and l.lid = 15 group by r.uid, r.lid;

uid 12 bestaat, lid 15 bestaat, en de relatie ook. Ik krijg er dan ook 1 regel uit, met de count(r.rid) goed weergegeven: 1. Maar als de relatie NIET bestaat, krijg ik niets terug, en dat is jammer :'(

Het liefst zou ik hebben
count(l.lid), count(u.uid), count(r.rid) where l.lid = xx and u.uid = xx and r.uid = xx and r.lid = xx
maar dan moeten er dus ook 0-resultaten uitkomen, en die zie ik nog niet.. weet iemand of dát kan? counts uit meerdere tabellen in een regel terugkrijgen?

Verwijderd

niet getest, maar volgens mij bestaat de relatie nog niet als er 0 rijen uit deze query komen...
code:
1
2
3
4
5
6
7
8
SELECT       r.rid 
FROM         logins AS l,
        users  AS u,
LEFT JOIN    relations AS r ON   
        r.lid = l.lid 
AND      r.uid = u.uid
WHERE       u.level < 20
AND     r.uid IS NULL