On 25-Jul-2003 Brian Newsham wrote: > Hi, > > I'm working on a PHP based website that loads custom pricing for users > where they logon. >
<random snipage ahead> > > majver and minver identify which price schedule to use. Each customer has > a different majver minver combination. > > The price schedule where majver=0 and minver=0 is called list price, and > is the only schedule that has a price for every single item. All the > other combinations of majver and minver make up an sub-list of items that > sell at the same discount level. If there is no price for a majver, > minver combo, an attempt is made to use the price where minver=0, > otherwise list price is used. > > To get the price of one item, I would do the following. > > mysql> SELECT * FROM item_price WHERE iid=3 AND majver IN (0,1) AND > minver IN (0,10) ORDER BY majver DESC, minver DESC; > +--------+--------+-----+--------+ >| majver | minver | iid | price | > +--------+--------+-----+--------+ >| 1 | 10 | 3 | 98.81 | <= first choice >| 1 | 0 | 3 | 91.21 | <= second choice >| 0 | 0 | 3 | 152.02 | <= last choice > +--------+--------+-----+--------+ > 3 rows in set (0.00 sec) > SELECT *, IF(majver=$major,IF(minver=$minor,2,1),0) AS sortfld ... ORDER BY sortfld DESC, majver DESC, minver DESC; > Most of the time I want to get information about more than one item at > once. However this complicates things. I only want 1 row for each iid, > specifically the row with the highest majver and minver for a given iid. > > EXAMPLES: > > mysql> SELECT * FROM item_price WHERE iid IN (3,4) AND majver IN (0,1) > AND minver IN (0,10) ORDER BY majver DESC, minver DESC; > +--------+--------+-----+--------+ >| majver | minver | iid | price | > +--------+--------+-----+--------+ >| 1 | 10 | 3 | 98.81 | >| 1 | 0 | 3 | 91.21 | <= Need to eliminate these rows >| 0 | 0 | 3 | 152.02 | <= >| 0 | 0 | 4 | 49.29 | > +--------+--------+-----+--------+ > 4 rows in set (0.00 sec) Order by iid and let PHP suppress the duplicates: $sql= "SELECT *, ... ORDER BY iid, sortfld DESC, majver DESC, minver DESC"; $res= mysql_query($sql); $previd= 0; echo '<table><caption>Best pricing</caption>'; while ($row= mysql_fetch_array($res)) { if ($previd != $row['iid']) { echo '<tr><td>', implode('</td><td>', $row), '</td></tr>'; $previd= $row['iid']; } } echo '</table>'; > > mysql> SELECT * FROM item_price WHERE iid IN (3,5) AND majver IN (0,1) > AND minver IN (0,10) ORDER BY majver DESC, minver DESC; > +--------+--------+-----+--------+ >| majver | minver | iid | price | > +--------+--------+-----+--------+ >| 1 | 10 | 3 | 98.81 | >| 1 | 10 | 5 | 89.77 | >| 1 | 0 | 3 | 91.21 | <= Need to eliminate these rows >| 1 | 0 | 5 | 82.87 | <= >| 0 | 0 | 3 | 152.02 | <= >| 0 | 0 | 5 | 138.11 | <= > +--------+--------+-----+--------+ > 6 rows in set (0.00 sec) > > Is it possible to get a result set with 1 row for each iid specified, and > the price where the majver and minver are the largest combination for > each iid? > See above, --the problem solves itself. Regards, -- Don Read [EMAIL PROTECTED] -- It's always darkest before the dawn. So if you are going to steal the neighbor's newspaper, that's the time to do it. (53kr33t w0rdz: sql table query) -- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]