2010-10-31 5 views
0

Что не так в этом вопросе?count для каждой строки

SELECT *, (SELECT COUNT(*) 
FROM 
(
    SELECT NULL 
    FROM words 
    WHERE project=projects.id 
    GROUP BY word 
    HAVING COUNT(*) > 1 
) T1) FROM projects 

MySQL возвращает 1054 Неизвестный столбец «projects.id» в «где предложение»

Благодаря

+1

Какова структура таблицы? Каким должен быть запрос? –

ответ

6

Это работает?

SELECT *, (SELECT COUNT(*) 
    FROM words 
    WHERE words.project=projects.id) as pCount 
FROM projects 
+0

Я собирался опубликовать детали структуры, когда увидел ваше сообщение, которое сделало трюк! пальцы вверх! – fabjoa

2

Ваш внутренний подзапрос ничего не знает о внешнем запросе, поэтому projects таблица не доступна.

+0

как я могу узнать? Если я делаю проекты JOIN, он учитывает каждое слово независимо от проекта. – fabjoa

+0

@fabjoa: Не могли бы вы показать нам свою структуру таблицы и пример из ожидаемого результата? –

+0

btw, поздравляю с золотым значком mySQL! –

2

Похоже, вы пытаетесь подсчитать для каждого проекта количество слов, которые происходят более одного раза.

Вы можете запустить подзапрос для всех проектов, а затем использовать JOIN, чтобы получить остальные данные из таблицы проектов:

SELECT projects.*, COUNT(word) AS cnt 
FROM projects 
LEFT JOIN (
     SELECT project, word 
     FROM words 
     GROUP BY project, word 
     HAVING COUNT(*) > 1 
) T1 
ON T1.project = projects.id 
GROUP BY projects.id 

Результат:

 
id cnt 
1 0 
2 1 
3 2 

Тестовые данные:

CREATE TABLE projects (id INT NOT NULL); 
INSERT INTO projects (id) VALUES (1), (2), (3); 

CREATE TABLE words (project INT NOT NULL, word VARCHAR(100) NOT NULL); 
INSERT INTO words (project, word) VALUES 
(1, 'a'), 
(2, 'a'), 
(2, 'b'), 
(2, 'b'), 
(3, 'b'), 
(3, 'b'), 
(3, 'c'), 
(3, 'c');