Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #3803

Re: SQL Puzzle - too many dimensions

From Lew <noone@lewscanon.com>
Newsgroups comp.lang.java.programmer
Subject Re: SQL Puzzle - too many dimensions
Date 2011-05-08 07:45 -0400
Organization albasani.net
Message-ID <iq5voi$7vq$1@news.albasani.net> (permalink)
References <tnibs6hnfdp2cav0u74d8heeqsdkvg1c6a@4ax.com>

Show all headers | View raw


Zapanaz wrote:
> I know this is a java group, not a SQL group, I am trying to bounce
> this off as many heads as I can and most Java programmers I know are
> good at SQL.

I truly hope you aren't saying that you multi-posted your question to multiple 
groups.  Cross-posting would make sense, but multi-posting is a sin.

> So I've got a table, song_versions, in an Oracle database. It has

Don't let the idiot who spouts anti-Oracle sentiment without any engineering 
basis affect your thinking at all.  Oracle, DB2, PostgreSQL, Derby, H2, SQL 
Server and a few others are excellent DBMS products.  (MySQL is not.)

> columns like this
>
> SONG_ID | SONG_VERSION_ID | RATING |
>
> SONG_ID is a key into the table songs. A song could be something like
> this, 'Money (That's What I Want)' by Berry Gordie
>
> http://www.youtube.com/watch?v=z6xkT7FMyTc
>
> And I have three versions of this song, one by Barrett Strong, one by
> The Beatles, and one by The Rolling Stones.
>
> I also have another song, 'Butterfly Caught' by Massive Attack. I only
> have the one version of this song.
>
> So my table looks like this
>
> SONG_ID | SONG_VERSION_ID | RATING |
> Money (That's What I Want) | Barrett Strong | 3 |
> Money (That's What I Want) | Rolling Stones | 2 |
> Money (That's What I Want) | Beatles | 1 |
> Butterfly Caught | Massive Attack | 1 |
>
> The actual values for the ID columns in the table are integers, this
> is just for clarity.

The "actual" IDs are the ones you show.  The physical *surrogate* IDs for 
which you use integers are a hack.  They are not the real IDs; they are used 
only for the convenience of implementation and should not be exposed to 
domain-relevant logic.

> My job is to come up with one SQL query which will return the
> highest-rated version of each song.

Others have answered this so I will not repeat their good advice.  The key 
point in the solutions presented was sub-SELECTs, or correlated subqueries. 
Study up on those.

> So for Money, the highest  rated version is the Barrett Strong
> version. For Butterfly Caught, there is only one version, so I want to
> return that, the Massive Attack version. So I would want my result to
> be the Barrett Strong version of Money and the Massive Attack version
> fo Butterfuly Caught.
>
> I can't think of a way to do it.
>
> To get the MAX(Rating), I would have to GROUP BY song_id. So I can get
> the numerical highest rating for each song, I can get a
>
> song_id | rating
>
> result set, but what I need is the song_version_id corresponding to
> that rating.
>
> Or I don't know, maybe something like
>
> select song_version_id
>   from song_versions
>   where rating =
>    (select max(rating)
>      from song_versions
>      where song_id = [??? I don't know ... the same song ID I'm talking
> about in the outer query]
>    )
>
> If I group by song_id, I lose the song_version_id.
>
> (Some DBs maybe I could cheat and return columns that aren't group by
> columns, but oracle won't let me pull that one.
>
> I just tried this in MySql
>
> select song_id, song_version_id, max(rating)
>   from song_versions
>   group by song_id
>
> and it worked, I got the Barrett Strong song_version_id, but then
> there's nothing in my query that actually gaurantees that result, so I
> don't know if I would want to depend on that in real code.
>
> But anyway, this is in an Oracle DB, and they don't let you include
> columns in a group-by query that aren't explicitly group-by that way.
> )

Ummm, that's SQL, not just Oracle.  Kinda hard to use an SQL-based product if 
you don't know the language and what is standard for it.

And you're right, this is a Java newsgroup.  People here do know some SQL, but 
you should not be surprised if you get a Java coding solution here instead of 
an SQL one, say one involving JPA.  A SQL or Oracle group is much more 
appropriate for this question.

It would help if you stick around and participate in future discussions and 
don't just eff us then forget us.  We love to help, as you saw from the high 
quality of answers others have given you, but there is a quid pro quo.

-- 
Lew
Honi soit qui mal y pense.
http://upload.wikimedia.org/wikipedia/commons/c/cf/Friz.jpg

Back to comp.lang.java.programmer | Previous | NextPrevious in thread | Find similar


Thread

SQL Puzzle - too many dimensions Zapanaz <http://joecosby.com/code/mail.pl@foo.com> - 2011-05-07 16:13 -0700
  Re: SQL Puzzle - too many dimensions Lawrence D'Oliveiro <ldo@geek-central.gen.new_zealand> - 2011-05-08 14:00 +1200
    Re: SQL Puzzle - too many dimensions Robert Klemme <shortcutter@googlemail.com> - 2011-05-08 13:08 +0200
      Re: SQL Puzzle - too many dimensions Lawrence D'Oliveiro <ldo@geek-central.gen.new_zealand> - 2011-05-09 00:01 +1200
        Re: SQL Puzzle - too many dimensions Lew <noone@lewscanon.com> - 2011-05-08 08:08 -0400
  Re: SQL Puzzle - too many dimensions Arved Sandstrom <asandstrom3minus1@eastlink.ca> - 2011-05-08 01:02 -0300
    Re: SQL Puzzle - too many dimensions Robert Klemme <shortcutter@googlemail.com> - 2011-05-08 13:03 +0200
      Re: SQL Puzzle - too many dimensions Arved Sandstrom <asandstrom3minus1@eastlink.ca> - 2011-05-08 11:14 -0300
        Re: SQL Puzzle - too many dimensions Robert Klemme <shortcutter@googlemail.com> - 2011-05-08 23:37 +0200
    Re: SQL Puzzle - too many dimensions Zapanaz <http://joecosby.com/code/mail.pl@foo.com> - 2011-05-08 16:06 -0700
      Re: SQL Puzzle - too many dimensions Robert Klemme <shortcutter@googlemail.com> - 2011-05-09 22:10 +0200
        Re: SQL Puzzle - too many dimensions Lawrence D'Oliveiro <ldo@geek-central.gen.new_zealand> - 2011-05-10 13:50 +1200
          Re: SQL Puzzle - too many dimensions Robert Klemme <shortcutter@googlemail.com> - 2011-05-10 00:06 -0700
            Re: SQL Puzzle - too many dimensions Lawrence D'Oliveiro <ldo@geek-central.gen.new_zealand> - 2011-05-13 22:55 +1200
              Re: SQL Puzzle - too many dimensions Robert Klemme <shortcutter@googlemail.com> - 2011-05-15 18:52 +0200
          Re: SQL Puzzle - too many dimensions Arved Sandstrom <asandstrom3minus1@eastlink.ca> - 2011-05-10 06:35 -0300
            Re: SQL Puzzle - too many dimensions Lawrence D'Oliveiro <ldo@geek-central.gen.new_zealand> - 2011-05-13 22:57 +1200
              Re: SQL Puzzle - too many dimensions Lew <noone@lewscanon.com> - 2011-05-13 07:45 -0400
              Re: SQL Puzzle - too many dimensions Arved Sandstrom <asandstrom3minus1@eastlink.ca> - 2011-05-15 13:09 -0300
                Re: SQL Puzzle - too many dimensions Robert Klemme <shortcutter@googlemail.com> - 2011-05-15 18:56 +0200
  Re: SQL Puzzle - too many dimensions Roedy Green <see_website@mindprod.com.invalid> - 2011-05-07 23:32 -0700
    Re: SQL Puzzle - too many dimensions Roedy Green <see_website@mindprod.com.invalid> - 2011-05-07 23:36 -0700
      Re: SQL Puzzle - too many dimensions Lawrence D'Oliveiro <ldo@geek-central.gen.new_zealand> - 2011-05-08 20:43 +1200
        Re: SQL Puzzle - too many dimensions Robert Klemme <shortcutter@googlemail.com> - 2011-05-09 01:27 -0700
  Re: SQL Puzzle - too many dimensions Lew <noone@lewscanon.com> - 2011-05-08 07:45 -0400

csiph-web