объединение двух таблиц на основе данных cookie - PullRequest
0 голосов
/ 14 июля 2009

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

Я знаю, что мне нужно присоединиться, но я не очень часто их использую, и у меня пока что нет на них головы.

Существующий запрос, который выбирает элементы из базы данных:

$query = mysql_query("SELECT *, UNIX_TIMESTAMP(`date`) AS `date` FROM songs WHERE date >= DATE_SUB( NOW( ) , INTERVAL 2 WEEK ) ORDER BY date DESC");

Моя таблица избранных настроена следующим образом: ID FAVORITE USERID, где ID - это первичный ключ, FAVORITE - это идентификатор песни из композиций таблицы, а USERID - это хэш, сохраненный в файле cookie.

Мне нужно объединить все строки таблицы избранного, где поле USERID соответствует хеш-переменной cookie.

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

Ответы [ 2 ]

1 голос
/ 14 июля 2009

Это должно сделать это, я бы вообразил:

$user_id = intval($_COOKIE['user_id']);
$query = mysql_query(sprintf("
    SELECT *
    FROM songs s
       INNER JOIN favorites f
       ON f.favorite = s.id
    WHERE f.userid = %s
", $user_id));

Возможно, вам следует прочитать о различных типах объединений.

И затем, чтобы получить общее количество возвращенных строк, вы можете просто вызвать mysql_num_rows для результата:

$favorite_song_count = mysql_num_rows($query);

РЕДАКТИРОВАТЬ : Чтобы выбрать все песни, кроме заметки, которые являются предпочтительными, вы должны сделать это:

$query = mysql_query(sprintf("
    SELECT s.*, f.id as favorite_id
    FROM songs s
       LEFT JOIN favorites f
       ON f.favorite = s.id AND f.userid = %s
", $user_id));

Переключая его из INNER JOIN в LEFT JOIN, мы выбираем все песни, даже если у них нет соответствующей записи в таблице избранного. Любые песни, которые являются фаворитами предоставленного user_id, будут иметь ненулевое значение для favorite_id.

0 голосов
/ 14 июля 2009

Вы можете иметь логические (и, или, ...) операторы в условиях соединения:

select t1.*
from t1
join t2 on t1.id = t2.fid and t2.foo = 'blah'

Если вы также запрашиваете общее количество раз, когда каждая песня была «добавлена ​​в избранное», то вам также нужна группа по конструкции, например:

select *, count(f.id)
from songs as s
left join favorites as f on s.id = f.favorite and f.userid = <hash>
group by s.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...