2015-06-13 5 views
1

Я использую стандартную конфигурацию LAMP для apache2 (mysql и php5) и кодировку UTF8.mysql query, возвращающий двойные строки

У меня есть четыре таблицы.

Первый из названных articles и имеет 6 колонок:

id INT(11) AUTO_INCREMENT PRIMARY KEY, 
title VARCHAR(1000), 
posted (TIMESTAMP) 
author_id INT(11), 
extract TEXT, 
body TEXT 

Второй называется authors

id INT(11) AUTO INCREMENT PRIMARY KEY, 
name VARCHAR(100), 
img VARCHAR(100), 
bio TEXT 

Третий называется categories

id INT(2) AUTO_INCREMENT PRIMARY KEY, 
cat_name VARCHAR(100) 

а также четвертый - article_categories

id INT(2) AUTO_INCREMENT PRIMARY KEY, 
article_id INT(11), 
category_id INT(2) 

Теперь то, что я хочу, чтобы написать запрос MySQL, который будет найти название, имя автора и cat_name статьи. До сих пор я придумал это, и он возвращает 10 строк, в основном все категории, которые я настроил. (Я создал одну статью с 2 категориями и 5 категорий в таблице категорий).

Это мой запрос:

SELECT articles.title, authors.name, categories.cat_name 
FROM articles, authors, categories, article_categories 
WHERE title LIKE '%introduction%'; 

и мой результат:

+------------------------+-----------------------+--------------+ 
| title     | name     | cat_name  | 
+------------------------+-----------------------+--------------+ 
| An introduction to ptc | Yannick Šušteršič  | free   | 
| An introduction to ptc | Yannick Šušteršič  | free   | 
| An introduction to ptc | Yannick Šušteršič  | members-only | 
| An introduction to ptc | Yannick Šušteršič  | members-only | 
| An introduction to ptc | Yannick Šušteršič  | milestone | 
| An introduction to ptc | Yannick Šušteršič  | milestone | 
| An introduction to ptc | Yannick Šušteršič  | basic  | 
| An introduction to ptc | Yannick Šušteršič  | basic  | 
| An introduction to ptc | Yannick Šušteršič  | advanced  | 
| An introduction to ptc | Yannick Šušteršič  | advanced  | 
+------------------------+-----------------------+--------------+ 

Есть ли способ, чтобы отображать только статью один раз, со всей соответствующей категории имени в одной строке?

Если нет, то как я могу получить только релевантные результаты? Что я делаю не так? Благодаря

+0

Хорошо, я создал запрос с помощью anwsers предложил, и теперь я получаю 2 строки. Если я использую GROUP на них, он будет отображать только одну строку с одним cat_name, но мне нужны оба. Есть ли способ сделать это, или мне нужно сортировать результаты по PDO/jQuery? –

ответ

1

Вы забыли сравнить автора и статьи против категорий:

SELECT 
    articles.title, authors.name, GROUP_CONCAT(categories.cat_name)   
FROM 
    articles, authors, categories, article_categories 
WHERE 
    title LIKE '%introduction%' 
    AND articles.author_id = authors.id 
    AND articles.id = article_categories.article_id 
    AND article_categories.category_id = categories.id; 

Обновлено, это окончательное правильное утверждение, автором ОП.

+0

Теперь он возвращает 2 строки, одну и ту же статью дважды, с разными категориями. Есть ли способ показать две категории в одной строке под столбцом cat_name? –

+0

@ MihaŠušteršič, не зная данных и неспособных протестировать, используя 'distinct' и exsplicitly ссылаясь на' article_categories', это то, что я могу думать (обновленный ответ) – davidkonrad

+0

. Думаю, я всегда могу настроить 2 запроса, а затем работать с ними с использованием PDO или jQuery. Спасибо за помощь –

1

Вы делаете то, что называется times операции (декартово произведение) вместо join один, так что результат сочетает в себе все записи, даже если они не связаны. Чего не хватает в вашем запросе являются условия соединения ограничить результат только записи, которые на самом деле связаны между собой, то есть:

SELECT articles.title, authors.name, categories.cat_name 
FROM articles, authors, categories, article_categories 
WHERE title LIKE '%introduction%' 
AND article_categories.article_id = articles.id 
AND article_categories.category_id = categories.id 
AND articles.author_id = authors.id 
Смежные вопросы