2013-05-27 2 views
0

У меня есть таблица, как следующий:Регистрация вместо подзапроса

id user_id task task_closed 
    1  1  1   0 
    2  1  2   1 
    3  1  3   0 
    4  2  3   0 
    5  2  4   1 
    6  3  4   0 

Что мне нужно, это вопрос, что для данной задачи будет возвращать все виды использования, которые имеют эту задачу, и для каждого из них числа общих незакрытых задач, которые у них есть.

так, что если мы говорим о задаче 3 Я хочу, чтобы получить

user_id pending 
    1  2 
    2  1 

как в

SELECT tasks.user_id, 
     (SELECT COUNT(*) 
     FROM tasks t2 
     WHERE t2.user_id=tasks.user_id AND t2.task_closed=0 
     ) 
FROM tasks 
WHERE tasks.id=? 

Я хотел бы также переписать это как

SELECT user_id,COUNT(*) 
    FROM tasks 
    WHERE task=? AND task_closed=0 
    GROUP_BY user_id 
    WHERE user_id IN (SELECT t2.user_id from tasks t2 WHERE task=?); 

Но У меня есть сильное чувство, что должен быть более эффективный способ сделать это, каким-то образом присоединившись к таблице с ее Эльф.

любые идеи о том, как я должен это делать?

ответ

0

Попробуйте это:

SELECT 
    t1.user_id, 
    COUNT(*) 
FROM 
    tasks t1 
INNER JOIN tasks t2 
    ON t2.user_id=t1.user_id 
    AND t2.task_closed=0 
WHERE 
    t1.id=? 

Но если предположить, что идентификатор задачи является task столбцом и не id колонка (с идентификатором является уникальным и что означает, что для 1 задачи у вас есть не больше одного пользователя)

SELECT 
    t1.user_id, 
    COUNT(*) 
FROM 
    tasks t1 
INNER JOIN tasks t2 
    ON t2.user_id=t1.user_id 
    AND t2.task_closed=0 
WHERE 
    t1.task=? 
GROUP BY 
    t1.user_id 

UPDATE: Если вы хотите присоединиться к результатам запроса от выше, чтобы получить дополнительную информацию примера: некоторые пользовательские данные (field столбца user_details таблицу) можно использовать:

SELECT 
    tmp.user_id, 
    tmp.nb, 
    user_details.field 
FROM (
    SELECT 
     t1.user_id, 
     COUNT(*) as nb 
    FROM 
     tasks t1 
    INNER JOIN tasks t2 
     ON t2.user_id=t1.user_id 
     AND t2.task_closed=0 
    WHERE 
     t1.task=? 
    GROUP BY 
     t1.user_id 
) as tmp 
LEFT JOIN user_details 
    ON user_details.user_id = tmp.user_id 
+0

Задача - это действительно столбец, который hlods id задачи. – epeleg

+0

как я подозревал: D вы попробовали запрос? – Stephan

+0

Да и его работа. но почему-то я все еще не понимаю, как делать то, что я хочу, в общем случае :(Например, предположим, что теперь я хочу присоединиться к результатам этого запроса с некоторой другой таблицей (например, чтобы получить некоторые данные на основе user_id, которые могут встречаются в мультипликационных продуктах, которые нравятся пользователю, и я ожидаю получить несколько строк с данными из текущих результатов, дублированных по каждому понравившемуся продукту). Я приму ваш ответ здесь, но если вы дадите больше информации, я буду благодарен – epeleg

0

я думаю, что это будет работать:

выберите tasks.user_id, граф (*) от задач, где tasks.task =? и task_closed = 0 группа по user_id

+0

IHMO это только смотрит на состояние задачи для конкретной задачи для каждого пользователя и вовсе не задачи для этих пользователей. т. Е. В моем примере, если задан вопрос о задаче 3, если будет возвращать информацию только на основе строк 3 и 4 таблицы и игнорировать другие строки, принадлежащие пользователям в этих строках. – epeleg

1

Попробуйте этот запрос,

SELECT 
    b.userid, 
    count(*) as cnt 
FROM 
    (SELECT DISTINCT userId FROM tasks WHERE task=?) a 
INNER JOIN 
    tasks b 
ON 
    a.userId=b.userid 
WHERE 
    b.task_closed = 0 
GROUP BY 
    b.userid 

Это будет повторить то, что ваш делает. Но я смущен вашим запросом. вы считаете, что задача закрыта для всех задач, но вы хотите получить результат только для задачи, заданной пользователем.

+0

Я пытаюсь посмотреть на пользователей, связанных с конкретной задачей, но хочу знать, сколько открытых задач у каждого из них есть. – epeleg

+0

EXPLAIN в этом коде SQL кажется менее эффективным, чем другие. – epeleg

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