Присоединения MYSQL не работают должным образом - PullRequest
2 голосов
/ 13 декабря 2011

Я пытаюсь создать оператор соединения, чтобы решить мою проблему, но не могу разобраться с этим.

Я новичок в операторах объединения, поэтому, пожалуйста, потерпите меня, если в моем SQL-выражении нет смысла.

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

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

Таблица 1 с именем questions состоит из question_ref, questioner_user_ref, item_ref, seller_ref, question_text, timestamp

questions
===========
+--------------+--------------------+---------+-----------+--------------+----------+
| question_ref |questioner_user_ref |item_ref |seller_ref |question_text |timestamp |
+--------------+--------------------+---------+-----------+--------------+----------+

Таблица 2 с именем my_item_comments состоит из questioner_ref, item_ref, last_question_ref

my_item_comments
===========
+---------------+---------+------------------+
|questioner_ref |item_ref |last_question_ref |
+---------------+---------+------------------+

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

Поэтому я хочу создать набор записей вопросов, которые а).Кто-то ответил на вопрос о товаре, который продает пользователь. Б).Продавец ответил на вопрос, заданный пользователем,
c).Третий пользователь задал вопрос об элементе, о котором пользователь также задал вопрос.

Похоже на систему комментирования в Facebook, где вам сообщают о комментариях, сделанных людьми в отношении статусов, которые вы прокомментировали.

Итак, мое текущее SQL-выражение выглядит следующим образом:

$user_ref= current logged in user


  $sql=mysql_query("
    SELECT * FROM questions
    LEFT JOIN my_item_comments
    ON questions.item_ref=my_item_comments.item_ref
    WHERE questions.questioner_user_ref!='$user_ref'
    AND (questions.seller_ref='$user_ref' OR questions.item_ref=my_item_comments.item_ref
    ORDER BY timestamp DESC");

Результаты не работают, и я думаю, что это из-за OR questions.item_ref=my_item_comments.item_ref, но из-за своей жизни я не могу с этим разобраться.

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

заранее спасибо, Барри

Ответы [ 2 ]

1 голос
/ 13 декабря 2011
SELECT * FROM questions
LEFT JOIN my_item_comments ON questions.item_ref=my_item_comments.item_ref
WHERE 
   questions.questioner_user_ref != '$user_ref' AND 
   (questions.seller_ref='$user_ref' OR questions.item_ref=my_item_comments.item_ref)
ORDER BY timestamp DESC

Я думаю, что вам не хватает ) для включения предложения OR (в приведенном выше примере я его добавил)

0 голосов
/ 13 декабря 2011

Вы должны попытаться улучшить удобочитаемость для себя и для нас, чтобы вам было легче отлаживать и нам было легче помочь: -)

$q = "
    SELECT * 
      FROM questions
RIGHT JOIN my_item_comments ON questions.item_ref = my_item_comments.item_ref
     WHERE questions.questioner_user_ref != '".$user_ref."'
       AND (    questions.seller_ref = '".$user_ref."' 
            OR  questions.item_ref=my_item_comments.item_ref
            )
  ORDER BY timestamp DESC";

$rs = mysql_query($q);

И желательно только запрос с фиктивными данными

    SELECT * 
      FROM questions
RIGHT JOIN my_item_comments ON questions.item_ref = my_item_comments.item_ref
     WHERE questions.questioner_user_ref != 'dummy_ref'
       AND (    questions.seller_ref = 'dummy_ref' 
            OR  questions.item_ref=my_item_comments.item_ref
            )
  ORDER BY timestamp DESC

Попробуйте right join для вашего запроса.Левое соединение действительно получит все строки.

...