Запрос «Многие ко многим» одним курсором без повторения данных

#android #sqlite #cursor

#Android #sqlite #курсор

Вопрос:

Итак, я собираюсь сказать, что у меня есть три таблицы следующим образом:

        POSTS             POSTS_TAGS           TAGS
 ----- -----------   --------- --------   ----- ------- 
| _id |   title   | | post_id | tag_id | | _id | title | 
 ----- -----------   --------- --------   ----- ------- 
|  0  |    foo    | |    0    |    1   | |  0  |  baz  |
 ----- -----------   --------- --------   ----- ------- 
|  1  |    bar    | |    0    |    2   | |  1  | quux  |
 ----- -----------   --------- --------   ----- ------- 
                    |    1    |    0   | |  2  | corge |
                     --------- --------   ----- ------- 
                    |    1    |    2   |
                     --------- -------- 
  

Есть ли какой-либо способ сформулировать запрос с помощью SQLite таким образом, чтобы у меня мог быть курсор со следующими данными в нем:

row1 = <foo, <quux, corge>>
row2 = <bar, <baz, corge>>

В отличие от:

row1 = <foo, quux>
row2 = <foo, corge>
row3 = <bar, baz>
row4 = <bar, corge>

Однако я сильно сомневаюсь, что есть что-то, что даст мне именно это, поэтому я предполагаю, что мой реальный вопрос заключается в том, каков наилучший способ сформулировать запрос, подобный этому, чтобы я мог передать его обратно в свою activity, и он смог бы вернуть все эти данные в activity? Или мне действительно нужно будет снова перебирать курсор, чтобы «забрать» все дополнительные данные и реорганизовать их самостоятельно.

Комментарии:

1. Вы нашли какое-либо решение?

Ответ №1:

Есть решение:

 SELECT posts._id, posts.title, GROUP_CONCAT(tags._id) AS tags_id, GROUP_CONCAT(tags.tag_name) AS tags_name FROM posts 
LEFT OUTER JOIN posts_tags ON posts_tags.post_id=posts.post_id
LEFT OUTER JOIN tags ON posts_tags.tag_id=tags.tag_id
GROUP BY posts._id;
  

Пожалуйста, адаптируйте запрос к вашей проблеме 🙂

Вы можете найти документацию SQLite о concat(x) и concat(x,separator) здесь.

В любом случае вы также можете следить за моей проблемой в группе Google.

Комментарии:

1. Хотя это на самом деле не решает проблему в общем случае (поскольку создает строку из всех тегов), это служит мне для моих целей, поскольку теги должны не содержать запятых.

2. Не является фактическим решением проблемы