Dotaz na řešení pomocí SQL

Re:Dotaz na řešení pomocí SQL
« Odpověď #15 kdy: 21. 02. 2020, 21:16:59 »
 Nepovedlo se mi správně zkopírovat předchozí dotaz, takže znovu

Kód: [Vybrat]
SELECT t.id, t.uid, t.posted AS posted, p.topic_id, p.poster_id, u.email, u.url, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, u.avatar, u.avatar_width, u.avatar_height, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.message, p.posted AS posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online
FROM topics AS t
LEFT JOIN posts AS p ON ( t.id = p.topic_id )
INNER JOIN users AS u ON u.id = p.poster_id
OR u.id =5
INNER JOIN groups AS g ON g.g_id = u.group_id
LEFT JOIN online AS o ON ( o.user_id = u.id
AND o.user_id !=1
AND o.idle =0 )
WHERE t.uid =5
ORDER BY p.id
LIMIT 0 , 30


Logik

  • *****
  • 1 001
    • Zobrazit profil
    • E-mail
Re:Dotaz na řešení pomocí SQL
« Odpověď #16 kdy: 22. 02. 2020, 12:33:12 »
"Chci to mít striktně oddělené, protože články..."Nech si poradit. Striktně oddělené to furt může být např. booleanovským sloupcem. Zjednoduší se spousta věcí, např. právě autorství bude zachyceno standardním způsobem, odkaz na článek či post bude moci být řešen stejně atd.... Umění programovat je defakto umění nacházení společných vzorů.


===


Co se týče druhého dotazu, tak odpověď je jednoduchá: dvě pole se jmenují stejně. Musíš jedno přejmenovat: dát mu jiné
SELECT ... AS <jinejmeno>====


"Je to tak správně?"Obávám se, že ne:

INNER JOIN users AS u ON u.id = p.poster_id
OR u.id =5


Znamená připoj ke každýmu postu uživatele, který post napsal, nebo autora článku. Pokud bude více postů, autora článku tam budeš mít mockrát. Dobrej pokus, ale myslím, že na to jdeš moc komplikovaně a chceš nacpat všechno do jednoho dotazu.
Normálně to rozděl, zvlášť načti posty a pak zvlášť autory. Když bude milion postů od dvou autorů, tak nebudeš tahat z databáze milion emailů autorů.
Pokud bys trval na takovymdle velkym monolitnim dotazu, tak jsem Ti předtím radil blbě tady by to opravdu asi jediná šance byla unionem, kdy bys k řádkám s příspěvky přidal spešl řádky článek - autor s NULL ve sloupcích týkajících se postu (to jde zařídit dvěma způsobama, buďto UNION na celej dotaz, nebo UNION jen na tabulku postů, což by se asi napsalo nějak takhle (INNER JOIN (SELECT .... FROM post UNION  VALUES ROW (NULL, NULL,...)) posts)a v joinu
u.id = p.poster_id OR (u.id = 5 and poster_id is null)
ale to už je prostě masakr. Rozděl to na víc dotazů, nedělej kartézskej součin celý databáze.



Re:Dotaz na řešení pomocí SQL
« Odpověď #17 kdy: 22. 02. 2020, 17:07:05 »
U toho prvního INNER JOIN stačí upřesnit podmínku ON a nebude z toho kartézský součin:

Kód: [Vybrat]
ON (u.id=p.poster_id AND p.poster_id IS NOT NULL) OR (p.poster_id IS NULL AND u.id=5)

Re:Dotaz na řešení pomocí SQL
« Odpověď #18 kdy: 23. 02. 2020, 02:18:32 »
Kolik těch NULL tam má být?

Kód: [Vybrat]
SELECT t.id as topic_id, t.uid as poster_id, t.subject, t.desc_x, t.article as message, t.posted as posted, p.topic_id, p.poster_id, t.poster as username, u.email, u.url, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, u.avatar, u.avatar_width, u.avatar_height, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.message, p.posted as posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM topics AS t INNER JOIN (SELECT p.topic_id, p.poster_id, t.poster as username, u.email, u.url, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, u.avatar, u.avatar_width, u.avatar_height, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.message, p.posted as posted, p.edited, p.edited_by FROM post AS p UNION VALUES ROW (NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL)) posts) ON (t.id=p.topic_id) INNER JOIN users AS u ON (u.id=p.poster_id ) OR (p.poster_id IS NULL AND u.id=5) INNER JOIN groups AS g ON g.g_id=u.group_id LEFT JOIN online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE t.id=41 ORDER BY p.id

Přehledněji:
Kód: [Vybrat]
$query = array(
                    u.email_setting, u.num_posts, u.registered, u.admin_note, u.avatar, u.avatar_width, u.avatar_height, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.message, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online
'SELECT' => 't.id as topic_id, t.uid as poster_id, t.subject, t.desc_x, t.article as message, t.posted as posted, p.topic_id, p.poster_id, t.poster as username, u.email, u.url, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, u.avatar, u.avatar_width, u.avatar_height, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.message, p.posted as posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online',
'FROM' => 'topics AS t',
'JOINS' => array(
array(
'INNER JOIN' => '(SELECT p.topic_id, p.poster_id, t.poster as username, u.email, u.url, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, u.avatar, u.avatar_width, u.avatar_height, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.message, p.posted as posted, p.edited, p.edited_by FROM post AS p UNION VALUES ROW (NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL)) posts)',
'ON' => '(t.id=p.topic_id)'
),
array(
'INNER JOIN' => 'users AS u',
'ON' => '(u.id=p.poster_id ) OR (p.poster_id IS NULL AND u.id='.$authors_id.')'
),
array(
'INNER JOIN' => 'groups AS g',
'ON' => 'g.g_id=u.group_id'
),
array(
'LEFT JOIN' => 'online AS o',
'ON' => '(o.user_id=u.id AND o.user_id!=1 AND o.idle=0)'
)
),
'WHERE' => 't.id='.$id,
'ORDER BY' => 'p.id'
);

Chyba:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VALUES ROW (NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NUL' at line 1

Logik

  • *****
  • 1 001
    • Zobrazit profil
    • E-mail
Re:Dotaz na řešení pomocí SQL
« Odpověď #19 kdy: 23. 02. 2020, 17:46:58 »
ad 1) Jo, podmínku můžeš napsat takhle, ale pak Ti to tam nepřidá autora, když bude nějaká reakce (left join tam nepřidá řádku s null)ad 2) Tolik, kolik tam má bejt sloupců. Přesnou syntax Ti nepovím, protože s MySQL nepracuju (PostgreSQL považuji za podstatně kvalitnější databázi)