2013-05-31 5 views
0

Мне сложно найти класс базы данных PDO, который я пишу, чтобы хорошо играть с запросами, которые мы предлагаем в предложениях GROUP BY.PDO GROUP BY не возвращает результаты

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

т.е. статьи> статья-тег-ссылка < теги

Запрос Я пытаюсь запустить очень просто:

SELECT * FROM articles, article-tag-link, tags WHERE articles.articleID = article-tag-link.articleID AND tags.tagID = article-tag-link.tagID GROUP BY articles.articleID LIMIT 3; 

Я использую подготовленное заявление для выполнения запроса с PDO , и я знаю, что простые запросы без GROUP BY отлично работают, поскольку в других местах он не используется.

Так что, когда дело доходит до выполнения запроса, я делаю:

$result = $stmt->execute(); 
$results = $stmt->fetchAll(PDO::FETCH_ASSOC); 

Это возвращает результаты, я хочу, хотя они не сгруппированы должным образом. То есть одна статья, которая может иметь 3 тега, появится три раза (так как есть технически три записи, удовлетворяющие запросу - исключая GROUP BY). Так что, как будто GROUP BY игнорируется.

Я пришел через

$results = $stmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP); 
$results = array_map('reset', $results); 

Но что ведет себя так же, как ни странно. Это вернет только один результат (он не возвращает первую статью три раза - один раз для каждого прикладного тега), но он остановится на одном единственном результате - он не будет продолжать извлекать еще два.

Может кто-нибудь объяснить, как получить его для получения трех уникальных записей, удовлетворяющих запросу?

+0

мне удалось найти решение самостоятельно и Виль Я пишу это для всех, кто мог совершить ту же ошибку. Поскольку я написал свою собственную PDO-оболочку, я передавал все значения для запросов с помощью метода. Метод позаботился о том, чтобы подготовить заявление и связать все. То, что я делал, случайно пыталось связать значение GROUP BY, которое вызывало проблемы. Просто помните, чтобы не связывать это, и иметь GROUP BY как обычную часть отформатированного запроса. – Amo

ответ

0

вы можете использовать INNER JOIN вместо

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

SELECT * FROM articles a 
    INNER JOIN article-tag-link atl 
     ON a.articleID = atl.articleID 
    INNER JOIN tags t 
     ON t.tagID = atl.tagID 
    GROUP BY a.articleID 
    LIMIT 3; 

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

$sth->fetchAll(); 
+0

Сам запрос, который я написал только для упрощенного примера, и не работает, если я запускаю его непосредственно в mySQL. Это то, как PDO извлекает результаты, которые, как представляется, являются проблемой. – Amo

+0

try fetch как мой обновленный ответ –

+0

Я изменил $ results = $ stmt-> fetchAll (PDO :: FETCH_ASSOC); to $ results = $ stmt-> fetchAll(); но он по-прежнему не получает 3 результата .. только один – Amo

0

вам spesific поле показать

SELECT articles.articleID FROM articles, article-tag-link, tags WHERE articles.articleID = article-tag-link.articleID AND tags.tagID = article-tag-link.tagID GROUP BY articles.articleID LIMIT 3; 
Смежные вопросы