yeahz Posted November 11, 2010 Report Share Posted November 11, 2010 Vajag kārtot pēc laika no vairākām tabulām. Pašlaik oreder by ir šāds, taču tas nav tas, kas vajadzīgs: ORDER BY posts.time desc, topics.time desc Tagad viņš izvelk šādi: Pievienots pirms 3 min [no posts tabulas] Pievienots pirms 4 min [no posts tabulas] Pievienots pirms 5 min [no posts tabulas] Pievienots pirms 7 min [no posts tabulas] Pievienots pirms 3 min [no topics tabulas] Pievienots pirms 7 min [no posts tabulas] Pievienots pirms 7 min [no posts tabulas] Pievienots pirms 2 min [no topics tabulas] bet vajadzētu lai ir viss pēc normāla laika, nevis vispirms no postiem izvelk un pēc tam no topikiem. Bilde: Quote Link to comment Share on other sites More sharing options...
cilveks Posted November 11, 2010 Report Share Posted November 11, 2010 (edited) Iekopē pilnu vaicājumu. Piemēram šāds vaicājums nostrādā: SELECT time AS t FROM table1 UNION SELECT time AS t FROM table2 ORDER BY t Edited November 11, 2010 by cilveks Quote Link to comment Share on other sites More sharing options...
yeahz Posted November 11, 2010 Author Report Share Posted November 11, 2010 (edited) SELECT topics.id AS topic_id, topics.time AS topic_time, topics.title, topics.text, MAX(posts.time) AS post_time, users.username FROM topics LEFT JOIN posts ON topics.id=posts.topic_id LEFT JOIN users ON users.id=posts.owner WHERE group_id=7 GROUP BY topics.id ORDER BY posts.time desc, topics.time desc Edited November 11, 2010 by yeahz Quote Link to comment Share on other sites More sharing options...
cilveks Posted November 11, 2010 Report Share Posted November 11, 2010 Un kā tu iedomājies kārtot, ja abos laukos ir datums? Tobiš tev izvada šādi: | id | t.time | p.time || 3 | 20:22:39 | 20:28:47 | | 2 | 20:21:32 | 20:22:56 | | 1 | 20:21:27 | NULL | Quote Link to comment Share on other sites More sharing options...
yeahz Posted November 11, 2010 Author Report Share Posted November 11, 2010 tas laiks, kurš no tiem abiem ir lielāks, tas tiek ņemts kā pirmais, ja ir null tad otrs datums vienmēr pastāvēs un tiks ņemts vērā tikai tas. Quote Link to comment Share on other sites More sharing options...
cilveks Posted November 11, 2010 Report Share Posted November 11, 2010 Es jau ieteiktu nedaudz pamainīt loģiku, kamēr vēl tas ir iespējams un datu nav daudz. Man personīgi ne visai patīk ka šādā vietā izmanto GROUP BY. Jāuztaisa tāds risinājums, lai nebūtu šādi jāmudās. Ja pareizi saprotu tavu domu, tad tu pirmo postu glabā tabulā "topics"? CREATE TABLE topics ( id NUMERIC(1,0), time TIME ); CREATE TABLE posts ( topic_id NUMERIC(1,0) REFERENCES topics(id), time TIME ); INSERT INTO topics VALUES(1, now()); INSERT INTO topics VALUES(2, now()+1); INSERT INTO posts VALUES(2, now()+2); INSERT INTO topics VALUES(3, now()+3); INSERT INTO posts VALUES(2, now()+4); INSERT INTO posts VALUES(1, now()+5); INSERT INTO topics VALUES(4, now()+6); SELECT id, t.time AS topic_time, MAX(p.time) AS post_time FROM topics t LEFT JOIN posts p ON t.id=p.topic_id GROUP BY t.id ORDER BY CASE WHEN (MAX(p.time) IS NOT NULL AND MAX(p.time)>t.time) THEN MAX(p.time) ELSE t.time END DESC; Quote Link to comment Share on other sites More sharing options...
yeahz Posted November 11, 2010 Author Report Share Posted November 11, 2010 Jā, pirmais posts ir pie topics kā text. Paldies, tavs risinājums noderēja :) Quote Link to comment Share on other sites More sharing options...
yeahz Posted November 11, 2010 Author Report Share Posted November 11, 2010 (edited) Un pie viena, nonācu pie vēlvienas problēmas. SQL: SELECT g.id AS group_id, g.name, g.picture, MAX(t.id) AS topic_id, t.title, t.time AS topic_time FROM groups g LEFT JOIN topics t ON t.group_id=g.id WHERE g.category=1 GROUP BY g.id Kāpēc izselekotojot datus pēc MAX(t.id) attiecīgi netiek piemeklēti īstie dati pie t.title? Viņš man atgriež pavisam citu title, ne to kas vajadzīgs. (šis kverijs jau tiek lietots citur, nav runa par iepriekšējiem postiem) Edited November 11, 2010 by yeahz Quote Link to comment Share on other sites More sharing options...
Gints Plivna Posted November 12, 2010 Report Share Posted November 12, 2010 (edited) A kas ir iistie? ;) MySQLa praat iistais ir pirmais, kursh pagadaas. Un to jau Tu peec buutiibas esi prasiijis, Tu gribi maksimaalo id, bet neko nesaki par to kaadu title gribi. Un vispaar shai zinjaa MySQLs ir ljoti pielaidiigs, citaas DBVS shitaada haltuura (tas ka var grupeet peec mazaaka kolonu skaita nekaa select lista vienkaarshie elementi) neietu cauri. Gints Plivna http://datubazes.wordpress.com/ Edited November 12, 2010 by Gints Plivna Quote Link to comment Share on other sites More sharing options...
yeahz Posted November 12, 2010 Author Report Share Posted November 12, 2010 nu bet kā tad lai es iegūstu attiecīgi datus lielākajam ID no tās pašas rindas, no kuras tiek paņemts tas MAX(id)? tekstu jau es nevaru atgriezt kā kaut kādu MAX vai kkā tā :D Quote Link to comment Share on other sites More sharing options...
cilveks Posted November 12, 2010 Report Share Posted November 12, 2010 (edited) Tad pieliec vaicājumam nosacījumu WHERE t.id = (SELECT MAX(id) .. Edited November 12, 2010 by cilveks Quote Link to comment Share on other sites More sharing options...
Gints Plivna Posted November 12, 2010 Report Share Posted November 12, 2010 Jādara 2 soļos t.i. jātaisa vēl viens savienojums. Vispirms noskaidrojam katrai grupai lielāko topika id, tad katram id pielasam datus. SELECT g.id AS group_id, g.name, g.picture, t_id, t.title, t.time AS topic_time FROM groups g LEFT JOIN ( SELECT group_id, max(id) t_id FROM topics GROUP BY group_id) AS max_rows ON (g.id = max_rows.group_id) LEFT JOIN topics t ON (max_rows.t_id = t.id) Gints Plivna http://datubazes.wordpress.com Quote Link to comment Share on other sites More sharing options...
yeahz Posted November 13, 2010 Author Report Share Posted November 13, 2010 SELECT group_id, time, title, id FROM topics ORDER BY time DESC Šis atgriež šo: Kā lai panāk lai atgrieztu tikai šīs divas rindas? Rezultātā man vajadzētu iegūt tās rindas, kur laiks ir vislielākais starp katru group_id. Quote Link to comment Share on other sites More sharing options...
Gints Plivna Posted November 13, 2010 Report Share Posted November 13, 2010 Nu tas Tev mājasdarbs :) Varu pateikt hintu, ka jāņem mana pēdējā atbilde un no tās 3 savienotajām tabulām/apakšpieprasījumiem vajag pēdējos 2. Attiecīgi šādus uzdevumus risinot vajag tos sadalīt sīkāk, 1. solī atlasi grupas id un maksimālo laiku, otrā solī tiem uztaisi savienojumu ar sevis paša tabulu, kur atlasi pēc attiecīgā id un laika pārējās detaļas. Gints Plivna http://datubazes.wordpress.com Quote Link to comment Share on other sites More sharing options...
yeahz Posted November 13, 2010 Author Report Share Posted November 13, 2010 (edited) Neko nesapratu :D Kāpēc Tu gribi lai es taisu velvienu tabulu, ka man dati ir jāsalasa tikai no topics tabulas? Vajag vienkārši atrast lielāko laiku pie katra no group_id (un protams arī attiecīgās rindas datus - title utt). Edited November 13, 2010 by yeahz Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.