2013-03-11 2 views
1

У меня есть две таблицы с отношением друг к другу. Я присоединяюсь к таблицам по столбцу id. Моя проблема в том, что мне нужно подсчитать все совпадающие записи из второй таблицы (tablekey_id), но мне нужна информация из строки, помеченной логическим is_basedomain. В качестве примечания есть только одна строка с is_basedomain = 1 для набора строк с той же таблицей_и_ид.Выберите количество строк со связанными таблицами

Таблица: tablekey

id linkdata_id timestamp 
22 9495028175 2013-03-10 01:13:46 
23 8392740179 2013-03-10 21:23:25 

Таблица: searched_domains.

ПРИМЕЧАНИЕ: tablekey_id является внешним ключом к идентификатору в таблице таблицы.

id tablekey_id domain  is_basedomain 
1 22   somesite.com 1 
2 22   yahoo.com  0 
3 23   red.com  1 
4 23   blue.com  0 
5 23   green.com  0 

Heres запрос Im работает с. Я пытался использовать вспомогательный запрос, но я не могу выбрать только счетчик для текущего tablekey_id, так что это не сработает.

SELECT `tablekey_id`, `linkdata_id`, `timestamp`, `domain`, `is_basedomain`, 
    (SELECT COUNT(1) AS other FROM `searched_domains` AS dd 
    ON dd.tablekey_id = d.tablekey_id GROUP BY `tablekey_id`) AS count 
FROM `tablekey` AS k 
JOIN `searched_domains` AS d 
ON k.id = d.tablekey_id 
WHERE `is_basedomain` = 1 GROUP BY `tablekey_id` 

Результат, который я хотел бы получить обратно есть:

tablekey_id linkdata_id timestamp   domain  is_basedomain count 
22   9495028175 2013-03-10 01:13:46 somesite.com 1    2 
23   8392740179 2013-03-10 21:23:25 red.com  1    3 

Может кто-нибудь помочь мне получить это в одном запросе?

ответ

4

Вы можете рассматривать searched_domains строки, которые is_basedomain = 1 в виде отдельной таблицы в запросе и присоединиться к нему с другим экземпляром searched_domains (чтобы получить количество):

SELECT 
    d.tablekey_id, 
    k.linkdata_id, 
    k.timestamp, 
    d.domain, 
    d.is_basedomain, 
    COUNT(*) as 'count' 
FROM 
    tablekey AS k 
     join searched_domains AS d on d.tablekey_id=k.id 
     join searched_domains AS d2 on d2.tablekey_id=d.tablekey_id 
WHERE 
    d.is_basedomain = 1 
GROUP BY 
    d.tablekey_id, 
    k.linkdata_id, 
    k.timestamp, 
    d.domain, 
    d.is_basedomain 
3

у вас есть ошибка при использовании ON использовать вместо WHERE

попробовать это

SELECT `tablekey_id`, `linkdata_id`, `timestamp`, `domain`, `is_basedomain`, 
    (SELECT COUNT(1) AS other FROM `searched_domains` AS dd 
    where dd.tablekey_id = d.tablekey_id GROUP BY `tablekey_id`) AS count 

    FROM `tablekey` AS k 
    JOIN `searched_domains` AS d 
    ON k.id = d.tablekey_id 
    WHERE `is_basedomain` = 1 GROUP BY `tablekey_id` 

DEMO HERE

1

Там нет оснований использовать подзапрос, или каково ваше мнение?

SELECT 
    `tablekey_id`, 
    `linkdata_id`, 
    `timestamp`, 
    `domain`, 
    `is_basedomain`, 
    COUNT(*) as count 
FROM 
    `tablekey` AS k , 
    `searched_domains` AS d 
WHERE 
    k.id = d.tablekey_id AND 
    `is_basedomain` = 1 
GROUP BY 
    `tablekey_id`, 
    `linkdata_id`, 
    `timestamp`, 
    `domain`, 
    `is_basedomain` 

Если вы хотите только последнюю отметку о времени использования MAX(timestamp) as timestamp и удалить его из group by.

+0

не даст правильный результат, search_domains ограничивается только теми строками, где is_basedomain = 1. Это приведет к некорректному результату для подсчета столбца. – slaakso

+0

@slaakso я не понимаю. Я попробовал ваши и мои запросы в sql скрипте http://sqlfiddle.com/#!2/fdecf/3 – iiro

+0

Хорошо, возможно, я понял теперь после того, как вопрос был отредактирован. Ваш запрос echo_me дает разные результаты. Я проверю, что происходит :) – iiro

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