2015-06-16 4 views
0

Предположим, что у меня есть 3 различных таблиц отношения следующим образомИзвлечение данных из 3 таблиц Mysql

1st is tbl_users(id,gender,name) 
2nd is tbl_feeds(id,user_id,feed_value) 
3rd is tbl_favs(id,user_id,feed_id) 

где идентификатор первичный ключ для каждой таблицы.

Теперь предположим, что хочу получить данные, в которые должны поступать эти каналы, которые будут загружены пользователем Gender = Male с одним полем в каждой строке, которая должна сказать, что пользователь, который вызывает этот запрос, помечен этим фидом в качестве избранного или нет.

Так окончательные данные результата должны быть как следующее: где позволяет сказать, человек, который звонит этот запрос есть user_id=2 then is_favourite столбец должен содержать 1, если пользователь отмечен любимой, что особенно корма в противном случае is_favourite должен содержать 0.

user_id feed_id feed_value is_favourite gender 
1  2  xyz   1   M 
2  3  abc   0   M 
3  4  mno   0   M 

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

Я надеюсь, что у кого-то есть эта проблема до этого, и я могу получить от них помощь.

Я был бы так благодарен, если кто-то может решить мою проблему.

Благодаря

+0

Вы хотите JOIN между первыми 2 столами и LEFT JOIN на третий. – winmutt

+0

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

ответ

1

Что-то, как это должно работать:

SELECT 
    u.id AS user_id. 
    fe.id AS feed_id, 
    fe.feed_value, 
    IFNULL(fa.is_favourite, 0), 
    u.gender 
FROM 
    tbl_users u 
JOIN 
    tbl_feeds fe ON (fe.user_id = u.id) 
LEFT JOIN 
    tbl_favs fa ON (
    fa.user_id = u.id 
    AND 
    fa.feed_id = fe.id 
) 
+0

Спасибо, Крис работает, как и ожидалось, с небольшими изменениями. –

1

Для того, чтобы связать свои таблицы, вы должны найти наиболее общую связь между ними всеми. Эта ссылка: user_id. Вы хотите создать связь между всеми таблицами с JOIN, чтобы убедиться, что у каждого пользователя есть данные.

Теперь я не знаю, планируете ли вы, чтобы все таблицы имели данные с помощью user_id. Но я бы использовал INNER JOIN, так как он будет ТОЛЬКО показывать записи об этом user_id без нулей. Если другие таблицы могут быть POSSIBLY (не всегда гарантированы), вы должны использовать LEFT JOIN на основе таблиц, с которыми это возможно.

В качестве примера приведено описание SQLFiddle. Тем не менее, я рекомендую вам указать свои идентификационные поля в соответствии с именем вашей таблицы таким образом, нет путаницы!

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

SELECT 
     u.userid, 
     u.gender, 
     f.feedsid, 
     f.feedvalue, 
     (
     SELECT 
      COUNT(*) 
     FROM 
      tbl_favs a 
     WHERE 
      a.userid = u.userid AND 
      a.feedsid = f.feedsid 
    ) as isFavorite 
    FROM 
     tbl_users u 
    INNER JOIN 
     tbl_feeds f 
    ON 
     u.userid = f.userid 

~~~~ EDIT 1 ~~~~

В ответ на ваш комментарий, я обновил SQLFiddle и запрос. Я не верю, что вам действительно нужно присоединиться, основываясь на приведенной информации. Если вы хотите присоединиться, вы получите неожиданные результаты, так как вы попытаетесь создать общую ссылку между двумя таблицами, которые вам не нужны. Вместо этого вам нужно просто объединить таблицы и сделать подзапрос, чтобы определить из favs, если он является фаворитом пользователя.

SQLFiddle:

SELECT 
     u.userid, 
     f.feedsid, 
     u.name, 
     u.gender, 
     f.feedvalue, 
     (
     SELECT 
      COUNT(*) 
     FROM 
      tbl_favs a 
     WHERE 
      a.userid = u.userid AND 
      a.feedsid = f.feedsid 
    ) as isFavorite 
    FROM 
     tbl_users u, 
     tbl_feeds f 
    ORDER BY 
     u.userid, 
     f.feedsid 
+0

Я попробовал ваш запрос, но небольшая проблема похожа на ex: предположим, что A, B, C - это 3 пользователя с 1,2,3 пользователями id или. и F1, F2, F3 - 3 канала, загруженные пользователями A, B соответственно. и теперь скажем, что теперь пользователь C отмечен fav feed F1, F2, тогда, если я запрошу с user_id = 3, который для пользователя C, тогда он должен вывести все фиды, но isfav для F1, F2 имеет isfav = 1 и isfav = 0 для тех, которые не отмечены fav пользователем C. так что все кормы shud приходят, но isfav зависит от пользователя, зависит либо от того, что пользователь помечен fav для perticular feed, либо нет. –

+0

@LkThanvi Извините за задержку. Я обновил свой ответ в ответ на ваш комментарий. В принципе, объединение дало бы неожиданные результаты, поскольку вы пытались связать две таблицы вместе на общих границах. Если вы хотите отобразить все избранные пользователем пользователя, то соединение не может быть и речи. Вам просто нужно объединить две таблицы. SQLFiddle обновляется, и это также запрос. – Twister1002

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