Több találat több táblából, egy sorban

Több találat több táblából, egy sorban
2018-08-01T16:51:57+02:00
2018-08-01T19:28:54+02:00
2022-10-15T21:40:35+02:00
ivanyi.almos
Sziasztok!

Van egy adatbázis, amelyben eseményeket és az ahhoz kapcsolódó adatokat tárolom. Szeretném az eltárolt eseményeket soronként kiíratni. A problémám az, hogy egy eseményhez 3 felhasználó is hozzá lehet rendelve, és nem tudok olyan query-t írni, ami a célnak megfelelő kimenetet adja. Ebben kérném a nálam okosabbak segítségét :)

Íz adatbázis releváns táblái, oszlopai így néznek ki:

CREATE TABLE cities ( c_id int(11) NOT NULL, c_name varchar(255) NOT NULL ) CREATE TABLE `events` ( e_id int(11) NOT NULL, e_event_type_id int(11) NOT NULL, e_member1_id int(11) NOT NULL, e_member2_id int(11) DEFAULT NULL, e_city_id int(11) NOT NULL, e_date date NOT NULL, e_cere_leader_id int(11) NOT NULL ) CREATE TABLE event_types ( et_id int(11) NOT NULL, et_name varchar(255) NOT NULL ) CREATE TABLE members ( m_id int(11) NOT NULL, m_title varchar(10) DEFAULT NULL, m_surname varchar(255) NOT NULL, m_forename varchar(255) NOT NULL ) ALTER TABLE cities ADD PRIMARY KEY (c_id); ALTER TABLE `events` ADD PRIMARY KEY (e_id); ALTER TABLE event_types ADD PRIMARY KEY (et_id); ALTER TABLE members ADD PRIMARY KEY (m_id); ALTER TABLE cities MODIFY c_id int(11) NOT NULL AUTO_INCREMENT; ALTER TABLE `events` MODIFY e_id int(11) NOT NULL AUTO_INCREMENT; ALTER TABLE event_types MODIFY et_id int(11) NOT NULL AUTO_INCREMENT; ALTER TABLE members MODIFY m_id int(11) NOT NULL AUTO_INCREMENT; COMMIT;
Ilyesmi lenne a legjobb kimenet: 

Array ( [type] => Esküvő [date] => 2018-08-01 [city] => Iszapszentgilisztás [member1] => Bubi Béla [member2] => Cupi Cecília [cleader] => Dr Duci Dávid )


egy ilyenig jutottam:

SELECT e.e_id, e.e_date, e.e_cere_leader_id, e.e_member1_id, e.e_member2_id, GROUP_CONCAT(m.m_title), GROUP_CONCAT(m.m_surname), GROUP_CONCAT(m.m_forename), et.et_name, c.c_name FROM `events` AS e, members AS m, event_types AS et, cities AS c WHERE ( e.e_cere_leader_id = m.m_id OR( e.e_member1_id = m.m_id OR e.e_member2_id = m.m_id ) ) AND e.e_event_type_id = et.et_id AND e.e_city_id = c.c_id GROUP BY e.e_id
Ezzel az a baj, hogy olyan, mintha a neveket véletlenszerűen kapnám vissza, nem pedig olyan sorrendben, hogy cere_leader, e_member1, member2

Példa: (mindig Kozma Amira volt a "cere_leader"

Array ( [e_id] => 7 [e_date] => 2017-10-31 [e_cere_leader_id] => 12258 [e_member1_id] => 15045 [e_member2_id] => 0 [GROUP_CONCAT(m.m_title)] => ,vitéz [GROUP_CONCAT(m.m_surname)] => Kozma,Horthi [GROUP_CONCAT(m.m_forename)] => Amira,Myklós [et_name] => Keresztelő [c_name] => Hort ) Array ( [e_id] => 8 [e_date] => 2017-12-31 [e_cere_leader_id] => 12258 [e_member1_id] => 15046 [e_member2_id] => 0 [GROUP_CONCAT(m.m_title)] => gróf, [GROUP_CONCAT(m.m_surname)] => Szécshenjy,Kozma [GROUP_CONCAT(m.m_forename)] => Ezsvány,Amira [et_name] => Temetés [c_name] => Fedémes ) Array ( [e_id] => 9 [e_date] => 2017-12-31 [e_cere_leader_id] => 12258 [e_member1_id] => 15046 [e_member2_id] => 15047 [GROUP_CONCAT(m.m_title)] => az,,gróf [GROUP_CONCAT(m.m_surname)] => Iványi,Kozma,Szécshenjy [GROUP_CONCAT(m.m_forename)] => Álmos,Amira,Ezsvány [et_name] => Esküvő [c_name] => Budapest 2. kerület )
Tudna valaki segíteni, hogy hogy lehetne ez használhatóbb?
Üdv
Mutasd a teljes hozzászólást!
Hali!

Ha jól értettem a feladatot:
SELECT `e`.`e_id` , `e`.`e_date` , `c`.`c_name` , `et`.`et_name` , `e`.`e_cere_leader_id` , `e`.`e_member1_id` , `e`.`e_member2_id` , `m1`.`m_title` AS `cleader_title` , CONCAT(`m1`.`m_surname`, ' ', `m1`.`m_forename`) AS `cleader_name` , `m2`.`m_title` AS `member1_title` , CONCAT(`m2`.`m_surname`, ' ', `m2`.`m_forename`) AS `member1_name` , `m3`.`m_title` AS `member2_title` , CONCAT(`m3`.`m_surname`, ' ', `m3`.`m_forename`) AS `member2_name` FROM `events` AS `e` INNER JOIN `cities` AS `c` ON (`c`.`c_id` = `e`.`e_city_id`) INNER JOIN `event_types` AS `et` ON (`et`.`et_id` = `e`.`e_event_type_id`) LEFT JOIN `members` AS `m1` ON (`m1`.`m_id` = `e`.`e_cere_leader_id`) LEFT JOIN `members` AS `m2` ON (`m2`.`m_id` = `e`.`e_member1_id`) LEFT JOIN `members` AS `m3` ON (`m3`.`m_id` = `e`.`e_member2_id`) ORDER BY `e`.`e_date` ASC

Mutasd a teljes hozzászólást!

  • Lyááály, tökéletes, hálás köszönet!

    Ez nekem több jóféle sört is megérne, ha volna rá lehetőség :D

    Voltaképp az AS és a JOIN a két kulcsszó, amik nem (teljes) ismeretében nem sikerült rájönnöm a megoldásra.

    Annyi módosítást tettem csak, hogy mivel a title (tituls) is a névhez tartozik, azt is beemeltem, így:

    SELECT `e`.`e_id` , `e`.`e_date` , `c`.`c_name` , `et`.`et_name` , `e`.`e_cere_leader_id` , `e`.`e_member1_id` , `e`.`e_member2_id` , CONCAT(`m1`.`m_title`, ' ', `m1`.`m_surname`, ' ', `m1`.`m_forename`) AS `cleader_name` , CONCAT(`m2`.`m_title`, ' ', `m2`.`m_surname`, ' ', `m2`.`m_forename`) AS `member1_name` , CONCAT(`m3`.`m_title`, ' ', `m3`.`m_surname`, ' ', `m3`.`m_forename`) AS `member2_name` FROM `events` AS `e` INNER JOIN `cities` AS `c` ON (`c`.`c_id` = `e`.`e_city_id`) INNER JOIN `event_types` AS `et` ON (`et`.`et_id` = `e`.`e_event_type_id`) LEFT JOIN `members` AS `m1` ON (`m1`.`m_id` = `e`.`e_cere_leader_id`) LEFT JOIN `members` AS `m2` ON (`m2`.`m_id` = `e`.`e_member1_id`) LEFT JOIN `members` AS `m3` ON (`m3`.`m_id` = `e`.`e_member2_id`) ORDER BY `e`.`e_date` ASC
    De ez már csak apróság.
    Mutasd a teljes hozzászólást!
  • basszus, véletlenül nem a megoldásodat fogadtam el megoldásként... 

    Van lehetőség ezt korrigálni?
    Mutasd a teljes hozzászólást!
  • Na, látom, már meg is oldódott. Köszönet érte :)
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd