Autor Zpráva
RiZe
Profil
Babrám se s SQL dotazem na spojování tabulek. Mám několik tabulek, tabulku uživatelů (cth_users), session relací (cth_sessions) a další nepodstatné pro můj problém. Tabulky mají následující strukturu:


CREATE TABLE `cth_sessions` (
`session_sessid` varchar(40) NOT NULL, // Session ID
`session_userid` mediumint(8) unsigned NOT NULL default '0', // Uživatelovo ID
`session_last_visit` datetime NOT NULL default '0000-00-00 00:00:00', // Poslední návštěva (zápis při odhlášení)
`session_start` datetime NOT NULL default '0000-00-00 00:00:00', // Počátek relace
`session_end` datetime NOT NULL default '0000-00-00 00:00:00', // Platnost relace do ...
`session_ip` varchar(40) NOT NULL default '0', // IP adresa uživatele
`session_browser` varchar(150) NOT NULL default '', // Prohlížeč uživatele
`session_autologin` tinyint(1) NOT NULL default '0', // Automatické přihlášení
PRIMARY KEY (`session_sessid`),
KEY `session_end` (`session_end`),
KEY `session_userid` (`session_userid`)
);

CREATE TABLE `cth_users` (
`user_id` int(11) NOT NULL auto_increment, // ID uživatele
`user_active` int(1) default '0', // Stav přihlášení (přihlášen/nepřihlášen)
`user_action` datetime default '0000-00-00 00:00:00', // Čas poslední akce
`user_name` varchar(60) default NULL, // Jméno uživatele
`user_password` varchar(40) default NULL, // Heslo
`user_ip` varchar(32) default NULL, // IP adresa
`user_fname` varchar(60) default NULL, // Křestní jm.
`user_sname` varchar(60) default NULL, // Přijmení
`user_lastlog` datetime default '0000-00-00 00:00:00', // Poslední přístup
PRIMARY KEY (`user_id`),
KEY `user_active` (`user_active`)
);


Ukládám si do cache souboru souboru všechny uživatele a k tomu připojuji dodatečná data. Zde potřebuji připojit k uživateli ještě hodnotu sloupce session_last_visit a to do sloupce user_action, který je v tabulce cth_sessions. Potřebuji ho připojit podle uživatelova ID. Složil jsem dotaz, který ale nefunguje. Dotaz je ořezán od nepotřebných dat, stejně jako tabulky (je jich více). Prosím poraďte, díky


SELECT u.*, s.session_last_visit AS user_action FROM ".CTH_USERS." u
LEFT JOIN ".CTH_SESSIONS." s ON u.user_id = s.session_userid
WHERE s.session_userid
ORDER BY user_id
tiso
Profil
V tom dotaze čo si tu dal nemáš dobre definovanie aliasov (u, s) a nemáš dokončenú podmienku pre WHERE, si si istý že to v pôvodnom dotaze máš správne?
RiZe
Profil
Podmínka je stejná i původním dotazu a správností dotazu si nejsem jistý, jinak bych sem nepsal :)
MzM
Profil
co jsi myslel tím "Dotaz je ořezán od nepotřebných dat, ..."
Moc dotazu nerozumím, chceš jenom lidi, co mají nějaká data v tabulce cth_sessions?
RiZe
Profil
Myslel jsem tím, že připojované tabulky, které s problémem nemají nic společného jsem z dotazu odstranil. Ano, potřebuju lidi z tabulky cth_users a ke každému uživateli připojit sloupec session_last_visit z tabulky cth_sessions podle ID uživatele, které je v každé tabulce.
tiso
Profil
RiZe
1. FROM ".CTH_USERS." AS u LEFT JOIN ".CTH_SESSIONS." AS s
2. čo podľa Teba znamená WHERE s.session_userid ? Čo to má robiť?
RiZe
Profil
Zkoušel jsem, testoval, takže je to s jistotou blbě. Chtělo by to složit ten dotaz znovu. Co se týče aliasu, uviděl jsem tenhle systém u phpBB a funguje, mrknu schválně do manuálu.
Kajman_
Profil *
Složil jsem dotaz, který ale nefunguje
Nefunguje nějak konrétně? Mysql hlásí chybu?

A není to user_id tak velké, že se nevejde korektně do session_userid?
RiZe
Profil
Nehlásí žádnou chybu, ale prvního uživatele to vybralo 2x (asi kvůli více řádkům v cth_sessions).

Není velké
Kajman_
Profil *
Tak si dejte

select distinct ...

Asi ten uživatel přišel přes dva prohlížeče nebo tak něco.
RiZe
Profil
Takže takhle, potřebuji vybrat všechna uživatelská data z tabulky cth_users a jeden sloupec z cth_sessions. Řádky user_id a session_userid uchovávají oba hodnotu uživatelova ID. Potřebuji tedy vybrat vše z cth_users plus session_last_visit a to podle těch dvou sloupců se stejnout hodnotou.
Kajman_
Profil *
SELECT u.*, max(s.session_last_visit) AS user_action FROM `cth_users` u, `cth_sessions` s
WHERE u.user_id = s.session_userid
group by u.user_id
ORDER BY u.user_id
RiZe
Profil
Vyzkouším, díky moc.

EDIT: vyšel jsem z mého řešení s tvými prvnky (některými) a kompletní dotaz je níže, včetně těch "přebytečných" dat. Všechny uživatele to začalo vybírat až po odstranění podmínky where user_id = session_userid. Teď už to běhá jak má ;-)


SELECT u.*, g.*, gm.*, r.rank_name, w.weapon_name, MAX(s.session_last_visit) AS last_action FROM ".CTH_USERS." u
INNER JOIN ".CTH_GAME." gm ON u.user_game = gm.game_id
INNER JOIN ".CTH_GROUPS." g ON u.user_group = g.group_id
INNER JOIN ".CTH_RANKS." r ON u.user_rank = r.rank_id
INNER JOIN ".CTH_WEAPONS." w ON u.user_weapon = w.weapon_id
LEFT JOIN ".CTH_SESSIONS." s ON s.session_userid = u.user_id
GROUP BY u.user_id
ORDER BY user_id
Toto téma je uzamčeno. Odpověď nelze zaslat.