2016-03-12 6 views
0

Я пытаюсь присоединиться к 3 таблицам, чтобы создать страницу, на которой отображаются имя участника, их веб-сайты и их музыкальные альбомы.повторяющиеся значения при объединении нескольких таблиц

Проблема, с которой я сталкиваюсь, заключается в том, что я получаю повторяющиеся данные.

Например, строки, которые я получаю взамен, повторяют названия альбомов дважды; и значения веб-сайта повторяются трижды.

Ниже, как мои таблицы выглядит следующим образом:

member_profiles 

id | alias_name 
2 | Lazy Turtle 
3 | Ms. Cat 

member_websites 

id | member_id |   site_url   | site_title 
57 |  3  |  http://example.com | My Site 
58 |  3  | http://fakesite.com | Cool Site 
59 |  2  | http://anotherfake.com | Turtlez Site 

music_albums 

id | member_id |  album_title 
5 |  3  |  Cats Rock N Roll 
6 |  2  |  My Slowness 
7 |  3  | Meow Pt. II (The Remixes) 
8 |  3  | The Worst Songs I've Made 

Как я могу исправить это без необходимости разделять мои запросы и, возможно, ставя под угрозу производительность? My SQL-запрос выглядит следующим образом:

SELECT mp.name, mw.site_url, mw.site_title, ma.album_title 
FROM member_profiles mp 
LEFT JOIN member_websites mw ON mw.member_id = mp.id 
LEFT JOIN music_albums ma ON ma.member_id = mp.id 
WHERE mp.id = 3 
+1

Для элемента id = 3 есть дубликаты записей в member_websites и music_albums. Разумно иметь несколько строк на выходе для этого –

+0

, каков ваш ожидаемый результат для idd = 3? –

+0

отредактировал мой ответ. но в основном, что происходит, так это то, что с этим запросом я получаю 6 строк. и site_urls, site_titles и album_titles все повторяются .. то есть, когда я прохожу через строки, значения будут повторяться ... хотя я думаю, я мог бы просто проверить php, если ive уже выдает значение и больше не выводит его, если это случай .. – threedollarbill

ответ

1

Просто добавьте GROUP_COCAT().

SELECT mp.name, GROUP_CONCAT(mw.site_url), GROUP_CONCAT(mw.site_title), GROUP_CONCAT(ma.album_title) 
FROM member_profiles mp 
LEFT JOIN member_websites mw ON mw.member_id = mp.id 
LEFT JOIN music_albums ma ON ma.member_id = mp.id 
WHERE mp.id = 3 
0

Вы используете присоединиться к основной таблицы и другой таблицы имеет несколько веб-сайтов и несколько музыкальных альбомов, вы можете использовать подзапросы для вас ответ.

SELECT mp.name, 
(select group_concat(mw.site_url) from member_websites mw where mw.member_id = mp.id) as websites , 
(select group_concat(ma.album_title) from music_albums ma where ma.member_id = mp.id) as albums 
FROM member_profiles mp 
WHERE mp.id = 3 
+0

эй, я думаю, sub-запросы могут работать. Хотя я обеспокоен тем, как они могут замедлить производительность. Возможно, мне лучше просто перебирать строки в PHP и хранить значения для site_url, site_title и album_title в своих собственных массивах .. я бы проверил, если значение уже существует в массиве, прежде чем нажимать его. – threedollarbill

+0

Ваш процесс медленнее, чем при использовании подзапросов, вы будете запускать запросы три раза, я думаю, что это не очень хорошая идея , –

+0

И вы также уменьшаете производительность за счет цикла. –

Смежные вопросы