Limit a MySQL query to only one 1 result from each set

173 Views Asked by At

I apologise now for the wording of the question, wasn't quite sure how to articulate this.

I have the following MySQL query:

select mn.meter_name, m.meter_number, m.meter_location, r.rates_meter_rate, r.rates_meter_PPD, m.meter_ID, mt.metertracking_periodend, mt.metertracking_read, mt.metertracking_readend FROM db_meters m, db_meters_name mn, db_rates_meter r, db_meters_tracking mt WHERE m.ICP_ID = '227' AND m.meter_name_ID = mn.meter_name_ID AND r.meter_ID = m.meter_ID AND (r.rates_meter_start <= '2013-08-31' AND r.rates_meter_end >= '2013-08-31') AND mt.meter_ID = m.meter_ID ORDER BY ABS( DATEDIFF( metertracking_periodend, NOW() ) ) 

It then returns:

**meter_name meter_number   meter_location   rates_meter_rate rates_meter_PPD meter_ID metertracking_periodend metertracking_read metertracking_readend**
 Anytime      9011656:1     in front office       0.15560          10.00         15            2013-07-31              685               69665
 Anytime      9011656:2     in front office       0.09000          10.00         16            2013-07-31              293               1022
 Anytime      9011656:1     in front office       0.15560          10.00         15            2013-06-30              589               68980

I want to limit the result so that each meter only returns once, so in this case meters(ID) 15 & 16

I hope someone can help, and thanks in advance.

2

There are 2 best solutions below

1
On BEST ANSWER

use Group by in your statement :

select mn.meter_name, m.meter_number, m.meter_location, r.rates_meter_rate, r.rates_meter_PPD, m.meter_ID, mt.metertracking_periodend, mt.metertracking_read, mt.metertracking_readend FROM db_meters m, db_meters_name mn, db_rates_meter r, db_meters_tracking mt WHERE m.ICP_ID = '227' AND m.meter_name_ID = mn.meter_name_ID AND r.meter_ID = m.meter_ID AND (r.rates_meter_start <= '2013-08-31' AND r.rates_meter_end >= '2013-08-31') AND mt.meter_ID = m.meter_ID group by meter_ID ORDER BY ABS( DATEDIFF( metertracking_periodend, NOW() ) ) 
0
On

Well adding:

GROUP BY meter_ID

should do the job.

I'm not sure what your other fields represent and whether you'd want to use some kind of aggregate function such as SUM() in the query.