Jump to content
php.lv forumi

MYSQL - SUM + LEFT JOIN


anonīms

Recommended Posts

Kverijs: http://paste.php.lv/97eac3bafb15a1fc0cf15cef4ebef1a1?lang=php

 

DB struktūra un dati:

173bf0wk2pw06v91quaa.jpg

 

Reāli dati tiek izvadīti:

 

title nid STATUS shows clicks *** 86 1 26460 182

 

 

kur varētu būt problēma, ka shows un arī clicks(to neuzskaitīju) parāda tādā daudzumā? ja izmantoju tikai vienu joinu, tad viss ir kārtībā. Nu pat idejas īsti nav prātā kāpēc kkas tāds notiek.

Link to comment
Share on other sites

kā var būt norādīts viens, ja abi tiek piejoinoti ar sakritību = node.nid? Parēķinājām - sanāk, ka beigās tas skaitlis 14x palielinās un tieši tik daudz rowi ir tabulā sakarā ar to id (86). Itkā varētu rakstīt iekšējo selectu (select blabla, ada, (select adlad from ada) as ada), bet tas nav tas uz ko es tēmēju

Link to comment
Share on other sites

Es vairs neatceros, kā to sauca no teorijas viedokļa(kaut kāds rezinājums), bet ieliec selectā tikai * un apsakties uz rezultātu, tad gan jau sapratīsi, kāpēc tā veidojas. :)

Bez subselectiem visticamāk neiztikt.

 

UN subselecti tev nav jāliek obligāti iekš select, tu tos tik pat labi vari joinot

...
JOIN (select sum(lauks), node_id from tabula group by node_id) as a on a.id = node.id
...

Edited by xPtv45z
Link to comment
Share on other sites

UN subselecti tev nav jāliek obligāti iekš select, tu tos tik pat labi vari joinot

...
JOIN (select sum(lauks), node_id from tabula group by node_id) as a on a.id = node.id
...

Neesmu drošs, bet man liekas šinīg gadījumā sākumā ir fullscan priekš visas tabulas un pēc tam tikai rezultāts tiek piejoinons... ja tā tad ļoti neefektīvs tieši konkrētajām vajadzībām jo banneru ieraksti vienmēr ir daudz :)

 

Bez subselectiem pirmais, kas nāk prātā ir UNION :) tiesa šim varētu būt problēmas, ja ir nepieciešami kādi nosacījumi no node tabulas

(SELECT banner_id, 'banner_show', SUM( cbanner_shows.shows ) count FROM cbanner_shows WHERER bannerer_id in(86) group by banner_id)
UNION
(SELECT banner_id, 'banner_click', SUM( cbanner_clicks.shows ) count FROM cbanner_clicks WHERER bannerer_id in (86) group by baner_id)

 

Tiesa rezultāti tiks atgriezti vertikālā formā

86, 'banner_show', X

86, 'banner_click', Y

 

Ja vienmēr tiek pieprasīts tikai viens baneris, var droši neselectēt nemaz to banner_id kolonu un nosaucījumā likt banner_id = 86 :)

Edited by draugz
Link to comment
Share on other sites

Pamēģini šo mistisko pieprasījumu, varbūt strādā pareizi :)

SELECT SUM( cbanner_shows.shows ) / count(cbanner_clicks.banner_id) AS shows, SUM( cbanner_clicks.clicks ) AS clicks
FROM node
LEFT JOIN cbanner_shows ON cbanner_shows.banner_id = node.nid
LEFT JOIN cbanner_clicks ON cbanner_clicks.banner_id = node.nid
WHERE node.nid =86

Edited by draugz
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...