Autor Zpráva
t4nn3r
Profil *
Ahoj mam mensi problem se spojovanim tabulek v dotazu. Snazim se udelat ACL pro account manager pro mangos.
Mam relacni tabulku acl_users, ta obsahuje tri sloupce accountid (odkaz na ID accountu mangos tabulky s accountama) groupid (odkaz na ID skupiny v tabulce acl_groups) a info (neni relace, nechano pro admina .. pro pripadny strceni do skupiny BAN aby se vedelo proc apod ...)

No a z tohodle potrebuju udelat nasledujici dotaz

select username from realmd.account where id in (select accountid from acl_users)+
select groupname from acl_groups where id in (select groupid from acl_users )+
select info from acl_users.

Nevite nekdo jak tohle pospojovat do jednoho dotazu ? (Zapsat to jako vice dotazu mi nepomuze)
diky
Joker
Profil
Nemyslíte spojování tabulek (JOIN)?

Pokud ne, můžete slovně popsat, co se vlastně má vybrat?
t4nn3r
Profil *
Ano myslim join, ale proste jsem logiku joinu nepochopil ... Zkousel jsem to ruzne ale vzdy mi PDO akorat zobrazil silenou vyjimku, ze ktere clovek taky neni moudry
Joker
Profil
Příklad:
SELECT * FROM acl_users u JOIN acl_groups g ON u.groupid=g.id


t4nn3r:
zobrazil silenou vyjimku, ze ktere clovek taky neni moudry
Člověk není moudrý z takovéhohle popisu, když sem napíšete ten dotaz a jakou chybu to hodí, třeba z toho někdo moudrý bude.
Kajman_
Profil *
Můžete zkusit uvést příklad dat v tabulkách a chtěný výstup? Třeba pak bude dotaz jasnější.

Jestli chcete připojit za sebe více řádků z různých dotazů a počet a typ sloupců odpovídá, pomůže union místo těch plusek.
t4nn3r
Profil *
no tabulka accout:
CREATE TABLE IF NOT EXISTS `account` (
  `id` int(11) unsigned NOT NULL COMMENT 'Identifier',
  `username` varchar(32) NOT NULL,
  `sha_pass_hash` varchar(40) NOT NULL DEFAULT '',
  `gmlevel` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `sessionkey` longtext,
  `v` longtext,
  `s` longtext,
  `email` text,
  `joindate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `last_ip` varchar(30) NOT NULL DEFAULT '0.0.0.0',
  `failed_logins` int(11) unsigned NOT NULL DEFAULT '0',
  `locked` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `last_login` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `active_realm_id` int(11) unsigned NOT NULL DEFAULT '0',
  `expansion` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `mutetime` bigint(40) unsigned NOT NULL DEFAULT '0',
  `locale` tinyint(3) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_username` (`username`),
  KEY `idx_gmlevel` (`gmlevel`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

tabulka acl_groups:
CREATE TABLE IF NOT EXISTS `acl_groups` (
`id` int(2) NOT NULL AUTO_INCREMENT,
`name` varchar(20) COLLATE utf8_bin NOT NULL,
`protected` int(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=14 ;
a relacni tabulka acl_users:
CREATE TABLE IF NOT EXISTS `acl_users` (
`account` int(20) NOT NULL,
`group` int(2) NOT NULL,
`info` text COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`account`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
potrebuju vypsat pro dalsi pouziti v ACL tabulku acl_users, kde account je odkaz na account.id a group je odkaz na acl_groups.id
t4nn3r
Profil *
takze vystup by mel byt: account.usermane, acl_groups.name, info
Joker
Profil
t4nn3r:
No tak analogicky k tomu, co jsem psal v [#4]:
SELECT a.username, g.name, u.info FROM acl_users u JOIN acl_groups g ON u.group = g.id JOIN account a ON ***

...kde místo *** bude podmínka, podle jaké se dá do spojení dohledat odpovídající záznam v tabulce account.
t4nn3r
Profil *
no hele diky za odpoved, a koukam zezt tohodle sem konecne pochopil jak pouzivat join :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: