Лучший способ избежать многих запросов в отношениях один-ко-многим - PullRequest
3 голосов
/ 29 октября 2011

У меня есть таблица статей с идентификатором, заголовком и другими.

У меня есть еще одна таблица, которая содержит все изображения для каждой статьи, называемая imagePath, в которой хранится путь к изображениям. Он содержит id, path, articleId и другие.

Каждая статья может иметь много изображений.

Я хочу получить статью и связанные изображения наилучшим образом.

Вариант 1:

SELECT a.id,a.title,b.path 
FROM articles a, imagepaths b
WHERE a.id=b.articleId 
LIMIT 10;

Проблема: это дает повторяющиеся результаты. Строки статьи дублируются для каждого изображения в imagepath

Вариант 2:

SELECT * 
FROM imagepath 
WHERE articleId='111111'

Но это должно быть сделано для каждого изображения. У меня есть страницы, на которых показаны тезисы статей для сотен статей. Если предположить, что 100 статей с двумя изображениями в каждой, то это потребует 1 вызова таблицы статей и 200 вызовов таблицы imagepath.

Как бы вы это сделали?

** Update **

Как насчет использования GROUP_CONCAT () следующим образом:

select a.id,a.title,GROUP_CONCAT(b.imagePath) from articles a
inner join imagePaths b on a.id=b.unique_id
group by a.id limit 3

Результат:

id  |     title |   GROUP_CONCAT(b.imagePath)

1   |   'title1'    |   path1,path2
2   |   'title2'    |   path3,path4,path5
3   |   'title3'    |   path6   

это дает всю необходимую информацию. Но запрос занимает 0,25 с. Я немного медлителен, учитывая, что мне может потребоваться выполнить много запросов.

Лучшее, что мы можем сделать?

1 Ответ

0 голосов
/ 29 октября 2011

Вариант 1 не дает дублированных результатов - только если у вас уже есть дублирующие данные в таблицах. Он дает вам более одного b.path для каждого a.title, но это все.

Например:

 articles:            imagepaths:

 ID | Title           articleId | Path
 ---+--------         ----------+-------------
  1 | Title1                 1  | /path1/
  2 | Title2                 1  | /path2/
                             2  | /path3/
                             2  | /path4/

... даст вам такой результат:

 ID | Title  | Path
 ---+--------+------
  1 | Title1 | /path1/
  1 | Title1 | /path2/
  2 | Title2 | /path3/
  2 | Title2 | /path4/

Вариант 1 в большинстве случаев так, как я бы это сделал. Я бы переформатировал запрос следующим образом:

 SELECT a.id, a.title, b.path 
 FROM articles a
 INNER JOIN imagepaths b ON a.id = b.articleId
 LIMIT 10;

Обновление:

Ofc вы можете сгруппировать его по Id:

 SELECT a.id, a.title, b.path 
 FROM articles a
 INNER JOIN imagepaths b ON a.id = b.articleId
 GROUP BY a.id;

Но тогда ваш результат будет выглядеть так:

 ID | Title  | Path
 ---+--------+------
  1 | Title1 | /path1/
  2 | Title2 | /path3/

Если это то, что вы хотите ... просто сделайте это! ; -)

...