запрос на присоединение, возвращающий странные результаты - PullRequest
0 голосов
/ 14 июля 2009

Я использую этот запрос, чтобы отобразить список песен и показать, какие песни были выбраны пользователем как избранные.

$query = mysql_query(
  sprintf("
    SELECT 
      s.*,
      UNIX_TIMESTAMP(`date`) AS `date`,
      f.userid as favoritehash
    FROM
      songs s
    LEFT JOIN
      favorites f
    ON 
      f.favorite = s.id
      AND f.userid = %s",
  $userhash)
);

Таблица songs настроена следующим образом: id artist title duration и т. Д. И т. Д.

Таблица favorites настроена как: id favorite userid

userid - это хэшированное значение, сохраненное в файле cookie для ссылки на уникального пользователя.

Запрос работает нормально, но по какой-то причине, если я отмечаю песню как избранную в одном браузере. А затем пометьте одну и ту же песню как избранную в другом браузере, чтобы смоделировать нескольких пользователей, песня будет отображаться дважды ... один раз для каждого раза, когда она помечена как избранная, но индикатор избранного а <3 будет по-прежнему отображаться правильно. </p>

Есть идеи?

Хорошо, заставить его работать с помощью removeign sprintf (), но любопытно узнать, почему, если у кого-то есть идеи.

Ответы [ 5 ]

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

Вы используете sprintf и% s (строка), но не заключаете полученное значение строки в кавычки. Если идентификатор пользователя является строкой, его необходимо заключить в кавычки, в противном случае используйте% d вместо% s. Поскольку при удалении sprintf он работает нормально, это может показаться проблемой.

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

У меня была похожая проблема, я думаю, что если вы измените And F.userid =% s на Где f.userid =% s, то это должно это исправить?.

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

Поскольку вы используете «левое объединение», я предполагаю, что вы хотите, чтобы список всех песен и чтобы избранные пользователи были легко различимы. то есть что-то вроде этого:

song1 details | date | null
song2 details | date | userhash  (favorite)
song3 details | date | null

Попробуйте следующее:

SELECT s.*, UNIX_TIMESTAMP(`date`) AS `date`, f.userid as favoritehash
FROM
  songs s
LEFT JOIN
  (SELECT userid, favorite FROM favorites WHERE userid = %s) f
ON 
  f.favorite = s.id
0 голосов
/ 14 июля 2009

Я считаю, что предыдущие предложения на самом деле победили бы LEFT JOIN, заставив его действовать как INNER JOIN; f.userid иногда будет NULL, а NULL всегда сравнивается как false.

Я бы начал с просмотра содержимого таблицы favorites. Если я понимаю вашу схему, вы, возможно, захотите установить уникальный ключ на favorites сверх favorite и userid, чтобы убедиться, что данный пользователь может избрать каждую песню только один раз. То есть вы можете получать повторяющиеся строки и, следовательно, повторяющиеся результаты.

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

Я думаю, что ваше ON предложение неправильно.

попробуйте вместо этого:

ON f.favorite = s.id
WHERE f.userid = %s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...