Jump to content
php.lv forumi

order by no vairākām tabulām


yeahz

Recommended Posts

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:

tftb83eqmz44m2xevm.jpg

Link to comment
Share on other sites

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 by yeahz
Link to comment
Share on other sites

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;

Link to comment
Share on other sites

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 by yeahz
Link to comment
Share on other sites

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 by Gints Plivna
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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 by yeahz
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...