Jump to content
php.lv forumi
Sign in to follow this  
anonīms

MYSQL - SUM + LEFT JOIN

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.

Share this post


Link to post
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

Share this post


Link to post
Share on other sites

Sorry, nvm tad; es neiebraucu, kas tev ir nepieciešams.

Edited by aaxc

Share this post


Link to post
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

Share this post


Link to post
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

Share this post


Link to post
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

Share this post


Link to post
Share on other sites

Nav ko tur daudz ņemties:

SELECT
(SELECT SUM(shows) FROM cbanner_shows WHERE banner_id = 86) AS shows,
(SELECT SUM(clicks) FROM cbanner_clicks WHERE banner_id = 86) AS clicks

Share this post


Link to post
Share on other sites

Ja nemaldos, to sauca par kopu reizināšanu.

akadēmiskais termins ir dekarta reizinājums.

 

Par tēmu - pieliec beigās GROUP BY node.nid.

Share this post


Link to post
Share on other sites

krikulis, group by neko nebūtu devis :)

bet nu jā, palieku tad pie subkveriju kverija, lai kā arī to negribētos :/

 

Paldies par atbildēm.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  

×
×
  • Create New...