Toon posts:

[mysql] Query over 3 tabellen, mischien een JOIN?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb de volgende query:
PHP:
1
<?$result = mysql_query('SELECT n.activated_last, g.z_indexFROM news n, user_groups g, users uWHERE g.group_id=u.group_id AND u.user_id=n.activated_last AND n.news_id=' . $_GET['nid']) or die(mysql_error());?>

Dit geeft geen foutmelding, maar het geeft ook geen result. De bedoeling is dat hij news.activated_last en user_groups.z_index uit de db haalt waar user_groups.group_id hetzelfde moet zijn als users.group_id en die moet weer hetzelfde zijn als news.user_id. Dus schematisch:
news.user_id -> users.group_id -> user_groups.z_index. Kan iemand mij helpen?

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 09:31

Crazy D

I think we should take a look.

Schrijf je query aub iets leesbaarder uit, zie de sticky's boven in de index van /14. Maakt het voor jezelf makkelijker, maar helemaal voor ons hier.

Exact expert nodig?


Verwijderd

WHERE n.user_id = u.group_id AND u.group_id = g.z_index

Dacht dat ie zo goed is :? try

Verwijderd

Topicstarter
Ik heb de query duidelijker gemaakt. Wat Bossel zegt is niet wat ik wil. Ik wil user_groups.z_index en news.activated_last hebben. Die laatste is niet zo'n probleem, maar die eerste wel. Want ik moet user_groups.z_index hebben waar user_groups.group_id = users.group_id waar users_user_id = news.activated_last. Dus (ff schematisch).

news.activated_last = users.user_id -> users.group_id = user_groups.group_id -> user_groups.z_index.

Verwijderd

$result = mysql_query('SELECT n.activated_last, g.z_indexFROM news n, user_groups g, users uWHERE g.group_id=u.group_id AND u.user_id=n.activated_last AND n.news_id=' . $_GET['nid']) or die(mysql_error());

je hebt from news n staan moet worden FROM news AS n zelfde geld voor user_groups enbz enz ..

  • Sjab-X
  • Registratie: September 2001
  • Laatst online: 06-08 11:45
Je hebt dus het volgende:

tabel NEWS met oa. velden NEWS_ID als key en ACTIVATED_LAST als user_id

tabel USERS met oa. velden USER_ID als key en GROUP_ID als group_id

tabel USER_GROUPS met oa. velden GROUP_ID als key en Z_INDEX

Als alle tabellen gevuld zijn dan zou je met de volgende query toch wel de data moeten krijgen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
    news.activated_last,
    user_groups.z_index
FROM
    news,
    user_groups,
    users
WHERE
    news.news_id       = $nid AND
    users.user_id     = news.activated_last AND
    user_groups.group_id = users.group_id
;

Verwijderd

Topicstarter
Dat werkt niet, ik krijg activated_last wel door, maar z_index niet. Ik heb het hele schema met PHPMyAdmin doorgelopen en alle waarden kloppen, dus daar ligt het niet aan. Ik post hier nog maar ff een dump van m'n tabel:
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
25
26
27
28
29
30
31
32
33
34
35
CREATE TABLE news (
  news_id mediumint(3) NOT NULL auto_increment,
  user_id bigint(8) NOT NULL default '0',
  title varchar(25) NOT NULL default '',
  msg text NOT NULL,
  timestamp timestamp(14) NOT NULL,
  activated tinyint(1) NOT NULL default '0',
  activated_last int(8) NOT NULL default '0',
  PRIMARY KEY  (news_id)
) TYPE=MyISAM;

CREATE TABLE user_groups (
  group_id tinyint(2) NOT NULL auto_increment,
  z_index tinyint(2) NOT NULL default '0',
  name varchar(30) NOT NULL default '',
  PRIMARY KEY  (group_id),
  UNIQUE KEY z_index (z_index)
) TYPE=MyISAM;

CREATE TABLE users (
  user_id int(8) NOT NULL auto_increment,
  group_id tinyint(2) NOT NULL default '1',
  username varchar(20) NOT NULL default '',
  password varchar(32) NOT NULL default '',
  email varchar(30) NOT NULL default '',
  name varchar(25) default NULL,
  website varchar(40) default NULL,
  sig varchar(120) default NULL,
  avatar varchar(40) NOT NULL default '',
  posts mediumint(7) NOT NULL default '0',
  points int(8) NOT NULL default '0',
  news_rights smallint(4) NOT NULL default '330',
  PRIMARY KEY  (user_id),
  FULLTEXT KEY sig (sig)
) TYPE=MyISAM;

Verwijderd

Topicstarter
Ik heb al een oplossing gevonden, maar daarvoor heb ik een functie nodig die kijkt welke van twee variabelen het dichts bij 0 zit. Ik dacht aan zoiets:
PHP:
1
<?$can_mod = (($activated_last < 0)? ((-{$member -> group_data('z_index')} > $activated_last) ? 1 : 0): (($member -> group_data('z_index') < $activated_last) ? 1 : 0));?>

Maar dat geeft een Parse Error en dat zal wel aan dat -$member gedoe liggen, maar zonder { en } werkt die ook niet. Iemand een idee?

  • Sjab-X
  • Registratie: September 2001
  • Laatst online: 06-08 11:45
Op donderdag 18 juli 2002 16:21 schreef _J_R_R het volgende:
Ik heb al een oplossing gevonden, maar daarvoor heb ik een functie nodig die kijkt welke van twee variabelen het dichts bij 0 zit. [..]
Je zegt nu dus dat activated_last een 1 of een 0 bevat?

Volgens mij moet je gewoon het volgende doen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
    news.activated_last,
    user_groups.z_index
FROM
    news,
    user_groups,
    users
WHERE
    news.news_id       = $nid AND
    users.user_id     = news.user_id AND
    user_groups.group_id = users.group_id
;

  • Grum
  • Registratie: Juni 2001
  • Niet online
http://php.net/min

of iets als
PHP:
1
<?if( abs($a) > abs($b) )   // $b is de kleinsteelse   // $a is de kleinste?>

Verwijderd

Topicstarter
Op donderdag 18 juli 2002 16:31 schreef Sjab-X het volgende:

[..]

Je zegt nu dus dat activated_last een 1 of een 0 bevat?

Volgens mij moet je gewoon het volgende doen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
    news.activated_last,
    user_groups.z_index
FROM
    news,
    user_groups,
    users
WHERE
    news.news_id       = $nid AND
    users.user_id     = news.user_id AND
    user_groups.group_id = users.group_id
;
Nee, ik had bedacht dat als jouw query niet werkt (en hij werkt niet :'()dat ik dan de z_index kopieer naar het activated veld in news, die 0 zet voor niet geactiveerd, positief voor toegestaan en negatief voor afgewezen. Als het nieuws afgewezen/toegestaan is, mag iemand met een lagere z_index het veranderen. Dus 1 is de laagste z_index enz.
Pagina: 1