В этом коде должен идти диалог между пользователями Код (PHP): $messa = mysql_query("SELECT * FROM message WHERE `to_u`='$id' AND from_u='$mess_user'"); if(mysql_num_rows($messa)>0){ while($rowmess = mysql_fetch_array($messa)){ $rowmessu = $rowmess['from_u']; $from_user = mysql_query("SELECT*FROM users WHERE id='$mess_user'"); ; if(mysql_num_rows($from_user)){ while($row_from = mysql_fetch_array($from_user)){ $mess .= $row_from['first_name']. " " . $row_from['last_name'] . " Тема: ".$rowmess['subject'] . " " . $rowmess['date'] . "<br/>" . $rowmess['message'] . "<br>"; } } } } $messa_from = mysql_query("SELECT * FROM message WHERE `from_u`='$id' AND to_u='$mess_user'"); if(mysql_num_rows($messa_from)>0){ while($rowmess_from = mysql_fetch_array($messa_from)){ $from_user_from = mysql_query("SELECT*FROM users WHERE id={$rowmess_from['from_u']}"); if(mysql_num_rows($from_user_from)){ while($row_from_user = mysql_fetch_array($from_user_from)){ $mess .= $row_from_user['first_name']. " " . $row_from_user['last_name'] . " Тема: ".$rowmess_from['subject'] . " " . $rowmess_from['date'] . "<br/>" . $rowmess_from['message'] . "<br>"; } } } } Но лог сообщений идет вот так Код (PHP): admin1 admin Тема: 1 2016-03-04 21:46:13 3 admin1 admin Тема: 1 2016-03-04 21:54:28 2 admin1 admin Тема: 1 2016-03-04 22:07:45 2 admin1 admin Тема: test 2016-03-05 22:35:11 test admin1 admin Тема: test2 2016-03-05 22:37:13 test2 admin1 admin Тема: test 2016-03-05 23:02:17 test adminus adminus Тема: test 2016-03-05 22:36:32 test adminus adminus Тема: test 2016-03-05 22:36:42 test adminus adminus Тема: test 2016-03-05 22:37:29 test adminus adminus Тема: test 2016-03-05 22:40:46 test adminus adminus Тема: test 2016-03-05 22:41:12 test adminus adminus Тема: test 2016-03-05 22:41:14 test adminus adminus Тема: test 2016-03-05 22:41:40 test adminus adminus Тема: test 2016-03-05 22:42:40 test adminus adminus Тема: te 2016-03-05 23:03:03 te Каким образом можно сделать поочередно по времени?
Дата хранится в datetime, только данные ведь выводятся в mess, ORDER BY date DESC не помогает. Сначала работает один кусок кода, а потом второй.
Укоротил код до такого Код (PHP): $messa = mysql_query("SELECT `users`.id AS id, `users`.last_name, `users`.first_name, `message`.to_u AS to_u,`message`.from_u AS from_u,`message`.subject AS subject, `message`.message AS message,`message`.date FROM message,users WHERE `users`.id=`message`.from_u"); while($row = mysql_fetch_array($messa)){ echo "Сообщение:" . " ". $row['first_name'] . $row['last_name'] . " " .$row['date']."<br/>Тема:" . $row['subject']. "<br/>" .$row['message'] ."<br/>"; } Не сталкивался с выводом из нескольких таблиц, поэтому вопрос, каким образом можно вывести данныe определенных пользователей в зависимости от значения $id? С таким запросом и не нужна еще одна колонка, to_u или from_u, можно в одну писать иды пользователей и выводить их в зависимости кому написали сообщения, я верно понимаю? Добавлено спустя 44 секунды: Все-таки необходимо 2 колонки, что-то перепутал... Добавлено спустя 10 минут 36 секунд: Код (PHP): $messa = mysql_query("SELECT `users`.id AS id, `users`.last_name, `users`.first_name, `message`.to_u AS to_u,`message`.from_u AS from_u,`message`.subject AS subject, `message`.message AS message,`message`.date FROM message,users WHERE `users`.id=`message`.to_u='$id'"); Таким образом работает, а такими нет... Код (PHP): $messa = mysql_query("SELECT `users`.id AS id, `users`.last_name, `users`.first_name, `message`.to_u AS to_u,`message`.from_u AS from_u,`message`.subject AS subject, `message`.message AS message,`message`.date FROM message,users WHERE `users`.id=`message`.to_u='$id' AND `message`.from_u='$mess_user'"); $messa = mysql_query("SELECT `users`.id AS id, `users`.last_name, `users`.first_name, `message`.to_u AS to_u,`message`.from_u AS from_u,`message`.subject AS subject, `message`.message AS message,`message`.date FROM message,users WHERE `users`.id=`message`.to_u='$id' AND users.id = `message`.from_u='$mess_user'");
Код (PHP): $messa = mysql_query("SELECT DISTINCT `users`.id AS id, `users`.last_name, `users`.first_name, `message`.from_u AS from_u, `message`.to_u AS to_u,`message`.subject AS subject, `message`.message AS message,`message`.date AS date, message.id FROM message,users WHERE users.id=message.to_u=$mess_user or users.id=message.to_u=$id GROUP BY date"); while($row = mysql_fetch_array($messa)){ $mess .= "Сообщение: " . $row['first_name'] . $row['last_name'] . " " .$row['date']."<br/>Тема:" . $row['subject']. "<br/>" .$row['message'] ."<br/>"; } Вот собственно и все господа. Теперь такой вопрос, он конечно не к месту, просто не охота новую тему открывать. У меня не получается разрушить POST, при нажатии на ctrl+R данные снова пишутся в базу, использую для этого unset как только данные записались. Добавлено спустя 20 минут 15 секунд: Не, так не подходит, нужно чтобы два параметра были обязательны, а не OR, нужно AND
Вообще-то новый вопрос должен быть в новой теме. После обработки пост делают редирект. Пусть даже на тот же адрес. Главное чтобы последним стал гет, а не пост. Добавлено спустя 4 минуты 6 секунд: Про "и" и "или" в запросе: ты на бумажке порисуй свои данные и попробуй так и сяк, изобрази из себя сервер БД Тогда в голове отпечатаются правила.
У меня к сожалению никак не получается. Я бы не стал писать на форуме по пустекам, перебробовл точно 101 способ, в прямом смысле этого слова. Перечитал кучу статей, гугл мой лучший друг поэтому и написал код с выводов в одном запросе с двух таблиц. Т.к. читал. И раздел для новичком Укажите хотябы на ошибку. В последнем коде была ошибка, исправил. Но не получается вывести с двух колонок иды юзеров для вывода их сообщения и их данных. Код (PHP): $messa = mysql_query("SELECT DISTINCT `users`.id AS id, `users`.last_name, `users`.first_name, `message`.from_u AS from_u, `message`.to_u AS to_u,`message`.subject AS subject, `message`.message AS message,`message`.date AS date, message.id FROM message,users WHERE users.id=message.from_u=$mess_user or users.id=message.to_u=$id GROUP BY date"); while($row = mysql_fetch_array($messa)){ $mess .= "Сообщение: " . $row['first_name'] . $row['last_name'] . " " .$row['date']."<br/>Тема:" . $row['subject']. "<br/>" .$row['message'] ."<br/>"; } Я знаю, что ошибка в данном кусочке кода, но именно какая, понять никак не могу... Код (PHP): WHERE users.id=message.from_u=$mess_user or users.id=message.to_u=$id GROUP BY date C AND не выводятся данные, почему? Если я выложу сколько перепробовал, боюсь питон тут родится, всмысле, много текста с маленьким скроллом
так нельзя писать. ты попробуй выполнить запрос с уже подставленными значениями в phpmyadmin или что там у тебя есть, увидишь ошибки.
Я пробовал, просто выдает не те значения которые мне необходимо получить. Код (PHP): SELECT DISTINCT `users`.id AS id, `users`.last_name, `users`.first_name, `message`.from_u AS from_u, `message`.to_u AS to_u,`message`.subject AS subject, `message`.message AS message,`message`.date AS date, message.id FROM message,users WHERE `users`.id IN (1,2) and `message`.from_u=2 and `message`.to_u=1 GROUP BY date Таким условием получаю одно значение, выводится только ID 1, второй никак не хочет.
Вам надо почитать про связи между таблицами. Про первичный ключ и внешний ключ. Про то как извлекать такие данные INNER JOIN'ом или LEFT JOIN.
Сформулируй своими словами русским языком какое ограничение надо наложить на выборку из базы. Мне кажется ты слишком рано начал писать программу.
Необходимо вывести данные двух пользователей по id из таблицы users и так же вывести их общение между собой, где from_u от кого, to_u - кому. Почему же рано, если все приходит с опытом, раздел соответствующий, где спрашивают что к чему, и зачем. Спасибо за совет, почитаю.
Я только намекаю, что программа это идея или мысль, оформленная по определенным правилам. Правила ты быстро узнаешь. А мыслить алгоритмически не у всех получается. Короче, правила таковы, что если нужны данные двух пользователей в одной строке, то надо таблицу пользователей подключать дважды. Чтобы избежать путаницы каждому экземпляру users придумываешь свой псевдоним. Например ufrom и uto. Как объединять таблицы надо почитать (искать слова алиас и join). Я не готов объяснять. Показать готовое могу, но это будет медвежья услуга. Ты должен сам добиться, мы только подсказываем.
Я решил свой вопрос, прочитал много литературы, узнал новое для себя. А вопрос свой решил таким образом. Код (PHP): $messa = mysql_query("SELECT first_name,last_name,date,avatar,from_u,to_u,subject,message FROM `users`,`message` WHERE `users`.id = `message`.from_u"); while($row = mysql_fetch_array($messa)){ if($id == $row['to_u'] and $mess_user == $row['from_u']){ ?> <?=$row['first_name'] ." ". $row['last_name']?><br/><img style='height:70px;width:50px;' src="<?=$row['avatar']?>"><br/><?=$row['date']?><br/>Тема: <?=$row['subject']?><br/><?=$row['message']?><hr><br/></div> <?php }elseif($mess_user == $row['to_u'] and $id == $row['from_u']){ ?> <?=$row['first_name'] ." ". $row['last_name']?><br/><img style='height:70px;width:50px;' src="<?=$row['avatar']?>"><br/><?=$row['date']?><br/>Тема: <?=$row['subject']?><br/><?=$row['message']?><hr><br/></div> <?php } }
Не надо использовать джоины и объединения таблиц для такой задачи. Код (PHP): $messa = mysql_query(" SELECT first_name, last_name, date, avatar, from_u, to_u, subject, message FROM `users`, `message` WHERE `users`.id = `message`.from_u" ); while($row = mysql_fetch_array($messa)){ if($id == $row['to_u'] and $mess_user == $row['from_u']){ Честно? Это клиника. Так нельзя делать по множеству причин. Вы знаете id'шники обоих юзеров, чью переписку надо вывести? Получите её Код (PHP): $perepiska = SELECT * FROM messages WHERE from=id AND to=id $user1 = SELECT * FROM users WHERE id=id $user2 = SELECT * FROM users WHERE id=id А потом уже генерируйте шаблон. Подсказка от модератора: Любой код или текст конфигурации пишите между тегом [code=php] и [/code]. Используйте отступы в коде для форматирования текста. Это помогает быстрее понять вас, увеличивает шанс на получение ответа. Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
Это не клиника, это решение задачи когда нет на нее ответа. id конечно же известны. Почему так нельзя делать, поясните.
Во-первых, джоины - это зло. При высокой нагрузке они ведут себя очень и очень плохо. Почитайте, что происходит в кишках базы, когда вы херачите джоин - как они обрабатываются. По мне, так лучше сто примитивных селектов в цикле с выборкой по айдишнику, чем один джоин. Естественно, речь идёт про крупные таблицы, где не одня сотня записей. Но это религиозный вопрос, я знаю. В любом случае, правило одно: если можно обойтись без джоина, без него нужно обойтись. Второй момент. То, что сделали вы "FROM `users`, `message` WHERE `users`.id = `message`.from_u" - это даже не джоин. Вы объединили каждую запись одной таблицы со всеми записями другой. WHERE - это не совсем условие объединения. У вас в одной таблице 10 записей, а в другой - 20. При таком объединении, если я правильно считаю, в результирующей таблице у вас получается 200 записей, которые нужно обработать. Представьте, что произойдёт, если у вас сотня пользователей и пара тысяч сообщений между ними. База крякнется. Третье. Я не вижу разницы между Код (PHP): if($id == $row['to_u'] and $mess_user == $row['from_u']) и Код (PHP): elseif($mess_user == $row['to_u'] and $id == $row['from_u']) . Может, это вы так скопипастили сюда, но там всё одинаково. Подсказка от модератора: Любой код или текст конфигурации пишите между тегом [code=php] и [/code]. Используйте отступы в коде для форматирования текста. Это помогает быстрее понять вас, увеличивает шанс на получение ответа. Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
Благодарю за пояснение. Тут идет диалог, в to_u кому адресовано сообщение, в from_u от кого. Когда id_1 пишет, в to_u добавляется 1, в from_u добавляется 2 или 3 и т.д, смотря кому пишет пользователь. Пользователь отвечает, его id заносится в from_u, а кому отвечает в to_u. И тем самым необходимо поднять данные из двух колонок, чтобы получился диалог. Добавлено спустя 24 минуты 42 секунды: В самом моем первом сообщении и было написано как Вы сказали. Там описана проблема, которую я не смог решить, попросил помощи, полистал гугл и пришел к выводу, что если нет другого решения моей проблемы, тогда лучше объединить таблицы.
Вы реально думаете, что кто-то изучал ваш код? Я больше 3-х строчек на форумах вообще не смотрю, так бегло прогляжу. Изучение чужого кода - очень времязатратное мероприятие. Это так к слову, на будущее. Вы пишите: $messa = mysql_query("SELECT * FROM message WHERE `to_u`='$id' AND from_u='$mess_user'"); $messa_from = mysql_query("SELECT * FROM message WHERE `from_u`='$id' AND to_u='$mess_user'"); А зачем? SELECT * FROM message WHERE (`from_u`='$id' AND to_u='$mess_user') OR (`to_u`='$id' AND from_u='$mess_user') Получаете сразу всю переписку и от того к этому, и от этого к тому. Сортируете по времени и у вас один массив со всей перепиской, готовый к выводу.
это старый джоин Добавлено спустя 1 минуту 20 секунд: а ещё можно чуток структуру бд поменять и выбирать по айдишнику диалога.
Это просто соединение двух таблиц. Указав две таблицы, вы так же указываете тип соединеня, возможно, даже не зная его. Запятая между названиями таблиц эквивалента констукции INNER JOIN (внутреннее соединение) или CROSS JOIN (перекрестное соединение). Такой тип соединения еще называют полным соединением (full join) или декартовым произведением (Cartesian product) таблиц. Это означает следующее: "Взять указанные таблицы и сделать из них одну большую. Большая таблица должна содержать строку для любой возможной комбинации строк из каждой указанноой в списке таблицы, независимо от того имеют они смысл или нет".