Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Alternative to using LIMIT keyword in a SubQuery in MYSQL

I have a table TEST with the following columns :

code_ver (VARCHAR)
suite (VARCHAR)
date (DATE)

Now I want to select 10 rows with a distinct value of code_ver & code_ver NOT LIKE '%DevBld%' sorted by date desc.

So I wrote the following query:

select * 
  from test 
 where code_ver IN (select DISTINCT code_ver 
                      from test 
                     where code_ver NOT LIKE '%DevBld%' 
                     ORDER by date DESC LIMIT 10);

This query should ideally work, but my version of MySQL says :

This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

Can someone suggest me an alternative to this query?

like image 204
Pi Horse Avatar asked Oct 10 '12 00:10

Pi Horse


People also ask

What can I use instead of limit in MySQL?

To get only the specified rows from the table, MySQL uses the LIMIT clause, whereas SQL uses the TOP clause, and Oracle uses the ROWNUM clause with the SELECT statement.

Can limit be used in subquery?

I've google it and found out that LIMIT can't be use in SubQuery in MySql, And as an alternate I could use JOIN however I'm not able to create the query to get the desired results.

What is alternative for subquery in SQL?

Using common table expressions (CTE): Common table expressions are an alternative to subqueries. You can learn more about this feature in the following article: CTEs in SQL Server; Querying Common Table Expressions.

What can I use instead of a subquery?

Another subquery that is easily replaced by a JOIN is the one used in an IN operator.


3 Answers

Answer suggested by Layke is wrong in my purview. Intention of using limit in subquery is so main query run on limited records fetched from subquery. And if we keep limit outside then it makes limit useless for subquery.

Since mysql doesn't support yet limit in subquery, instead you can use JOIN as follows:

            SELECT * FROM test     JOIN      (         SELECT DISTINCT code_ver          FROM test          WHERE code_ver NOT LIKE '%DevBld%'          ORDER BY date DESC LIMIT 10     ) d     ON test.code_ver     IN (d.code_ver)     ORDER BY xyz; 
like image 196
aneetkukreja Avatar answered Sep 21 '22 01:09

aneetkukreja


You can also use same query, just by adding one extra layer of select before subquery. and that's it. It will work.

select * from test 
where code_ver IN (select * from (select DISTINCT code_ver 
                      from test 
                     where code_ver NOT LIKE '%DevBld%' 
                     ORDER by date DESC LIMIT 10) as t1);
like image 33
yash Avatar answered Sep 23 '22 01:09

yash


Put the subquery in a derived table:

   SELECT test.*
     FROM test
LEFT JOIN (SELECT DISTINCT code_ver
             FROM mastertest
            WHERE code_ver NOT LIKE '%DevBld%'
            ORDER BY `date` DESC
            LIMIT 10) d
    USING (code_ver)
    WHERE d.code_ver IS NOT NULL;

(You could also RIGHT JOIN that, of course, and drop the outer WHERE condition.)

like image 30
pilcrow Avatar answered Sep 22 '22 01:09

pilcrow