Unix Technical Forum

SEO

vBulletin Search Engine Optimization


Go Back   Unix Technical Forum > Database Server Software > MySQL

Register FAQ Members List Calendar Search Today's Posts Mark Forums Read
  #1 (permalink)  
Old 04-29-2008, 08:27 PM
Greg Hennessy
 
Posts: n/a
Default how to get three lowest entries per bin

If I have a trivial table data where describe data
gives
mysql> describe data;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| flux | int(11) | YES | | NULL | |
| bin | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

and I have populated the tables with some values,
I can get the largest flux per bin by
select max(flux),bin from data group by bin;

What would ask for to get the largest three values
in each bin?

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #2 (permalink)  
Old 04-29-2008, 08:27 PM
Erick T. Barkhuis
 
Posts: n/a
Default Re: how to get three lowest entries per bin

Greg Hennessy:

> What would ask for to get the largest three values
> in each bin?


select bin
from data
order by bin desc
limit 3

--
Erick
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #3 (permalink)  
Old 04-29-2008, 08:27 PM
Greg Hennessy
 
Posts: n/a
Default Re: how to get three lowest entries per bin

On 2008-04-27, Erick T Barkhuis <erick.use-net@ardane.c-o-m> wrote:
> Greg Hennessy:
>
>> What would ask for to get the largest three values
>> in each bin?

>
> select bin
> from data
> order by bin desc
> limit 3


That does seem to get me what I think it should.

mysql> select * from data;
+------+------+
| flux | bin |
+------+------+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 2 | 2 |
| 4 | 2 |
| 6 | 2 |
| 8 | 2 |
| 4 | 1 |
+------+------+
8 rows in set (0.00 sec)

mysql> select flux,bin from data order by bin desc limit 3;
+------+------+
| flux | bin |
+------+------+
| 2 | 2 |
| 4 | 2 |
| 6 | 2 |
+------+------+
3 rows in set (0.00 sec)

While I get the three smallest flux in bin 2, I get no results
from bin one.



Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #4 (permalink)  
Old 04-29-2008, 08:27 PM
Greg Hennessy
 
Posts: n/a
Default Re: how to get three lowest entries per bin

On 2008-04-27, Greg Hennessy <greg.hennessy@cox.net> wrote:
> That does seem to get me what I think it should.


That *doesn't* seem to get me what I think it should. I hate typoes.


Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #5 (permalink)  
Old 04-29-2008, 08:27 PM
strawberry
 
Posts: n/a
Default Re: how to get three lowest entries per bin

On Apr 27, 3:21 pm, Greg Hennessy <greg.henne...@cox.net> wrote:
> On 2008-04-27, Greg Hennessy <greg.henne...@cox.net> wrote:
>
> > That does seem to get me what I think it should.

>
> That *doesn't* seem to get me what I think it should. I hate typoes.


SELECT t1.* FROM data t1
LEFT JOIN data t2
ON t1.bin = t2.bin
AND t1.flux >= t2.flux
GROUP BY t1.bin,t1.flux
HAVING COUNT(t1.bin) <=3;
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #6 (permalink)  
Old 04-29-2008, 08:27 PM
Greg Hennessy
 
Posts: n/a
Default Re: how to get three lowest entries per bin

On 2008-04-27, strawberry <zac.carey@gmail.com> wrote:
> SELECT t1.* FROM data t1
> LEFT JOIN data t2
> ON t1.bin = t2.bin
> AND t1.flux >= t2.flux
> GROUP BY t1.bin,t1.flux
> HAVING COUNT(t1.bin) <=3;


Thank you. With the minor flipping of a greater than to a less than
that does what I wanted. Now to figure out *why* it does what I
want.

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #7 (permalink)  
Old 04-29-2008, 08:27 PM
strawberry
 
Posts: n/a
Default Re: how to get three lowest entries per bin

On Apr 27, 4:00 pm, Greg Hennessy <greg.henne...@cox.net> wrote:
> On 2008-04-27, strawberry <zac.ca...@gmail.com> wrote:
>
> > SELECT t1.* FROM data t1
> > LEFT JOIN data t2
> > ON t1.bin = t2.bin
> > AND t1.flux >= t2.flux
> > GROUP BY t1.bin,t1.flux
> > HAVING COUNT(t1.bin) <=3;

>
> Thank you. With the minor flipping of a greater than to a less than
> that does what I wanted. Now to figure out *why* it does what I
> want.


It may help you to understand it by rewriting it like this:

SELECT t1.*, COUNT(t1.bin) rank
FROM data t1
LEFT JOIN data t2
ON t1.bin = t2.bin
AND t1.flux <= t2.flux
GROUP BY t1.bin,t1.flux
ORDER BY bin, rank;
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



All times are GMT. The time now is 07:17 AM.


Powered by vBulletin® Version 3.6.5
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145