SQL - использование результата из подзапроса в другом подзапросе - PullRequest
0 голосов
/ 28 января 2012
SELECT 
    *
FROM 
    (
        SELECT 
            qu.job_id AS `qu_job_id` , qu.engineer_id, qu.id AS `quote_id` , jb.author, jb.job_id, jb.job_title, SUBSTRING( jb.job_description, 1, 200 ) AS `short_description` , jb.image_ref, jb.timestamp
        FROM 
            jobs AS `jb`
        LEFT JOIN 
            quotes AS `qu` 
        ON 
        qu.job_id = jb.job_id
        WHERE 
        jb.author = " . ID . "
        GROUP BY 
        jb.job_id
        ORDER BY 
        jb.timestamp DESC
    ) AS `jobs`
    LEFT JOIN 
    (
        SELECT 
        COUNT( id ) AS `total_replies` , job_id
        FROM 
        quote_comments 
        WHERE
        job_id = jobs.job_id
    ) AS `replies` 
    ON 
        replies.job_id = jobs.job_id            

Мой вопрос: возможно ли (вышеприведенное не работает как есть) использовать результаты первого подзапроса для сравнения во втором? (т.е. job_id = jobs.job_id)

Привет

EDIT

(комментируя здесь больше места)

    SELECT 
    qu.engineer_id, 
    qu.id AS `quote_id`,
    jb.author,
    jb.job_id,
    jb.job_title,
    SUBSTRING( jb.job_description, 1, 200 ) AS `short_description` ,
    jb.image_ref,
    jb.timestamp,
    count(qu.id) AS comment_count
FROM 
    " . JOBS . " AS `jb`
LEFT JOIN 
    " . QUOTES . " AS `qu` 
ON 
    qu.job_id = jb.job_id 
WHERE 
    jb.author = " . ID . "
GROUP BY 
    jb.job_id,
    qu.engineer_id,
    qu.id,
    jb.author,
    jb.job_title,
    SUBSTRING( jb.job_description, 1, 200 ),
    jb.image_ref,
    jb.timestamp
ORDER BY 
    jb.timestamp DESC   

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

Вышеприведенное предложение, показанное ниже, сработало на первый взгляд, но оно возвращает задания, которые были переданы более одной цитаты x количество раз, причем количество цитат равно 1 для каждой. Есть идеи?

Ответы [ 3 ]

0 голосов
/ 28 января 2012
SELECT 
  jb.author,
  jb.job_id,
  jb.job_title,
  SUBSTRING( jb.job_description, 1, 200 ) AS `short_description` ,
  jb.image_ref,
  jb.timestamp,
  count(qu.id) AS quote_count
FROM 
  jobs AS `jb`
LEFT JOIN quotes AS `qu` ON qu.job_id = jb.job_id
WHERE 
  jb.author = " . ID . "
GROUP BY 
  jb.job_id,
  jb.author,
  jb.job_title,
  SUBSTRING( jb.job_description, 1, 200 )
  jb.image_ref,
  jb.timestamp
ORDER BY 
  jb.timestamp DESC

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

0 голосов
/ 28 января 2012

Редактирование вашего первого запроса:

SELECT 
    *
FROM 
    (   SELECT 
            qu.job_id AS `qu_job_id` , qu.engineer_id, qu.id AS `quote_id`,
            jb.author, jb.job_id, jb.job_title, 
            SUBSTRING( jb.job_description, 1, 200 ) AS `short_description`,
            jb.image_ref, jb.timestamp
        FROM 
            jobs AS `jb`
        LEFT JOIN 
            quotes AS `qu` 
        ON 
          qu.job_id = jb.job_id
        WHERE 
          jb.author = " . ID . "
        GROUP BY 
          jb.job_id
                               --- ORDER BY            --- not needed
                               --- jb.timestamp DESC   --- here
    ) AS `jobs`
    LEFT JOIN 
    (
        SELECT 
          COUNT( * ) AS `total_replies` , job_id
        FROM 
          quote_comments 
                                --- WHERE
                                --- job_id = jobs.job_id
        GROUP BY              --- replacing the WHERE 
          job_id              --- with a GROUP BY
    ) AS `replies` 
    ON 
        replies.job_id = jobs.job_id  
ORDER BY                        --- order clause 
  timestamp DESC                --- moved here
0 голосов
/ 28 января 2012
SELECT 
  qu.engineer_id, 
  qu.id AS `quote_id`,
  jb.author,
  jb.job_id,
  jb.job_title,
  SUBSTRING( jb.job_description, 1, 200 ) AS `short_description` ,
  jb.image_ref,
  jb.timestamp,
  count(qc.id) AS comment_count
FROM 
  jobs AS `jb`
LEFT JOIN quotes AS `qu` ON qu.job_id = jb.job_id
LEFT JOIN quote_comments AS `qc` ON qu.job_id = qc.job_id
WHERE 
  jb.author = " . ID . "
GROUP BY 
  jb.job_id,
  qu.engineer_id,
  qu.id,
  jb.author,
  jb.job_title,
  SUBSTRING( jb.job_description, 1, 200 )
  jb.image_ref,
  jb.timestamp
ORDER BY 
  jb.timestamp DESC

Это исключит синтаксический анализ подзапроса и ускорит выполнение вашего общего запроса. Я удалил идентификационный номер, потому что мы присоединяемся к нему, и, следовательно, нужно потянуть его только один раз. Я заметил, что мы сращиваемся прямо с рабочих мест, чтобы цитировать комментарии. Возможно, вы захотите связать цитаты, чтобы увидеть, сколько комментариев на цитату есть, а не сколько комментариев цитаты для работы в целом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...