2014-09-18 4 views
1

Вы можете увидеть, как в следующем вызове SQL, чтобы ограничить количество результатов только для этой конкретной части:Как ограничить количество результатов определенной части SQL-запроса?

OR (u1 != '2' AND u2 != '2' AND u3 != '2' AND m.membership_id = 1 AND m.aff IN (SELECT id FROM members WHERE id != 2 AND membership_id = 1 OR jv > 0))) 

Я хотел ограничить это число совпадений с точным числом, например, 150

Полный SQL является:

SELECT DISTINCT mid, did FROM product_access, members AS m 
WHERE mid = m.id AND m.active = 1 
     AND m.suspended = 0 
     AND (u1 = '2' OR u2 = '2' OR u3 = '2' OR (u1 != '2' AND u2 != '2' AND u3 != '2' AND m.membership_id = 1 AND m.aff IN (SELECT id FROM members WHERE id != 2 AND membership_id = 1 OR jv > 0))) GROUP BY mid 

Таким образом, результат должен включать в себя все где u1 = '2', все где u2 = '2', все где u3 = '2', но только 150, где:

(u1 != '2' AND u2 != '2' AND u3 != '2' AND m.membership_id = 1 AND m.aff IN (SELECT id FROM members WHERE id != 2 AND membership_id = 1 OR jv > 0)) 
+0

Какие СУБД вы используете? Postgres? Oracle? –

+2

Не могли бы вы использовать еще больше и даже более короткие запутанные переменные короткого кода? – Alexander

+0

Попробуйте 'SELECT TOP 150 ....' –

ответ

2

Вы всегда можете сделать подзапрос из каждой части вашего запроса и он ограничивался до н TOPMOST записей.

Из того, что я понимаю, что-то вроде этого должно хватить:

SELECT mid, did FROM(
SELECT DISTINCT mid, did FROM product_access, members AS m 
WHERE mid = m.id AND m.active = 1 
     AND m.suspended = 0 
     AND (u1 = '2' OR u2 = '2' OR u3 = '2') 

UNION SELECT TOP 150 DISTINCT mid, did FROM product_access, members AS m 
WHERE mid = m.id AND m.active = 1 
    AND m.suspended = 0 
    AND (u1 != '2' AND u2 != '2' AND u3 != '2' AND m.membership_id = 1 AND m.aff IN (SELECT id FROM members WHERE id != 2 AND membership_id = 1 OR jv > 0)) 

) GROUP BY mid 
+0

Спасибо, что помогло ... SELECT mid, did FROM (( ) SELECT DISTINCT mid, did FROM product_access, члены AS m WHERE mid = m.id AND m.active = 1 AND m.suspended = 0 AND (u1 = '2' ИЛИ ​​u2 = '2' ИЛИ ​​u3 = '2') GROUP BY mid ) UNION ( SELECT DISTINCT в середине, сделал FROM product_access, члены AS m WHERE mid = m.id AND m.active = 1 AND m.suspended = 0 AND (u1! = '2' AND u2! = '2' AND u3! = '2' AND m.membership_id = 1 AND m.aff IN (SELECT id FROM members WHERE id! = 2 AND membership_id = 1 OR jv> 0)) GROUP BY mid LIMIT 150 )) AS t –

1

Если SQL SERVER Тогда используйте TOP, если MY SQL Затем используйте LIMIT.

SQL-Server

SELECT TOP 10 * FROM MyTable; 

My SQL

SELECT * FROM MyTable LIMIT 10; 
+0

Это MySQL ... но не LIMIT ограничен полным запросом? Или можно применить это только к той части, которая упомянута выше? –

+1

Извините, но я не понимаю upvote? Этот ответ действительно не заполняет требования OP, которые должны ограничивать количество результатов, соответствующих части условий, а не все из них – Logar

+0

Я согласен с @Logar. Фрэнк, пожалуйста, разделите схему таблиц, образцы данных и желаемый результат. – AK47