2012-03-19 2 views
0

У меня есть таблица, которая выглядит следующим образом:выберите строки, в которых граф 2 поля больше, чем 1 с, где положение

╔════╦═════════╦═════════╦═══════╗ 
║ id ║ deleted ║ status ║ ref ║ 
╠════╬═════════╬═════════╬═══════╣ 
║ 1 ║  0 ║ pending ║ 10001 ║ 
║ 2 ║  0 ║ paid ║ 10001 ║ 
║ 3 ║  0 ║ paid ║ 10001 ║ 
║ 4 ║  0 ║ paid ║ 10002 ║ 
║ 5 ║  1 ║ pending ║ 10002 ║ 
║ 6 ║  1 ║ paid ║ 10002 ║ 
║ 7 ║  0 ║ pending ║ 10003 ║ 
║ 8 ║  0 ║ paid ║ 10003 ║ 
║ 9 ║  0 ║ paid ║ 10003 ║ 
║ 10 ║  0 ║ paid ║ 10003 ║ 
║ 11 ║  0 ║ pending ║ 10004 ║ 
║ 12 ║  0 ║ paid ║ 10004 ║ 
║ 13 ║  1 ║ pending ║ 10005 ║ 
║ 14 ║  1 ║ paid ║ 10005 ║ 
║ 15 ║  1 ║ paid ║ 10005 ║ 
║ 16 ║  0 ║ paid ║ 10005 ║ 
║ 17 ║  0 ║ pending ║ 10006 ║ 
║ 18 ║  0 ║ paid ║ 10006 ║ 
║ 19 ║  0 ║ paid ║ 10006 ║ 
╚════╩═════════╩═════════╩═══════╝ 

Я пытаюсь написать запрос MySQL, который будет возвращать строки, которые paid и не deleted. Но только там, где отсчет paid больше 1. Таким образом, результат должен быть:

╔════╦═════════╦════════╦═══════╗ 
║ id ║ deleted ║ status ║ ref ║ 
╠════╬═════════╬════════╬═══════╣ 
║ 2 ║  0 ║ paid ║ 10001 ║ 
║ 3 ║  0 ║ paid ║ 10001 ║ 
║ 8 ║  0 ║ paid ║ 10003 ║ 
║ 9 ║  0 ║ paid ║ 10003 ║ 
║ 10 ║  0 ║ paid ║ 10003 ║ 
║ 18 ║  0 ║ paid ║ 10006 ║ 
║ 19 ║  0 ║ paid ║ 10006 ║ 
╚════╩═════════╩════════╩═══════╝ 

Я пытался получить это с помощью следующего запроса, но он не делает то, что мне нужно, и я теперь, кажется, идет по кругу. Может ли кто-нибудь дать мне руку?

SELECT t1.* FROM orders t1 WHERE exists (SELECT * FROM orders t2 where t1.id != t2.id and t1.ref = t2.ref and t1.deleted = 0 and t1.status = 'paid')

Большое спасибо!

[изменить] arrgh! К сожалению, ребята, я забыл сказать, что мне нужно возвращать только те строки, которые имеют более чем 1 paid статус ... извините ...

+1

Выполняет 'SELECT t1. * FROM orders t1 WHERE t1.status = 'paid' и t1.deleted = 0;' не работает для вас? –

+0

Я отредактировал свой вопрос, так что извините за то, что не заметил это, когда я изначально разместил – SammyBlackBaron

ответ

2

Пожалуйста, поиграйте со следующим (не имеют экземпляра БД вокруг):

SELECT t.* 
FROM orders t 
INNER JOIN 
(
    SELECT ref, deleted, status 
    FROM orders 
    WHERE deleted = 0 and status = 'paid' 
    GROUP BY ref 
    HAVING count(ref) > 1 
) d 
ON t.ref = d.ref 
AND t.status = d.status 
AND t.deleted = d.deleted; 

(на основе http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=68374)

+0

, но это также возвращает строки состояния ожидания, используемые в таблице, которую я опубликовал – SammyBlackBaron

+0

К сожалению, я пропустил тот факт, то же 'ref' для' ожидающих' и 'платных' статусов. См. Фиксированный отчет. –

+0

отлично! спасибо :) – SammyBlackBaron

-1

Я думаю, что вы пытаетесь слишком трудно решить этот вопрос ... Take перерыв и запуск ur кода снова. В любом случае ответ уже дан в 1-й ответ ... Chilllllll

1

Передаст Баш:

select o.* 
from orders o 
inner join 
(
select ref, 
sum(case when status = 'paid' then 1 else 0 end) as paid_count, 
count(distinct status) as total_distinct_status_count 
from orders yt 
where deleted = 0 
group by ref 
) t1 on t1.ref = o.ref 
where o.status = 'paid' 
and o.deleted = 0 
and t1.paid_count > 1 
and t1.total_distinct_status_count > 1; 

кажется, чтобы дать ответ, что вы выложили данные данные размещены.

+0

спасибо, но он, кажется, не возвращает то, что мне нужно. При использовании по тем же данным, что и я, он также возвращает '12 | 0 | платные | 10004' – SammyBlackBaron

+0

Упс. Так что, это. Сообщение изменено. –

Смежные вопросы