Intereting Posts
Хранить данные сенсибилизации в Silverstripe 3.1 Кнопка PayPal представляет форму и одновременно вызывает вызов Ajax? Zend 1.11 и Doctrine 2 Auto генерируют все необходимое из уже существующей базы данных Запустить perl-файл из PHP-скрипта, но не дождаться вывода на Windows Server Zend_Db_Table_Abstract :: _ первичный массив возврата? Ошибка PHP: невозможно изменить информацию заголовка – уже отправленные заголовки Imagick. Изменение цвета для прозрачности Как добавить новый модуль в администрацию opencart? TCPDF ERROR: некоторые данные уже выведены, не удается отправить файл PDF test, если массив содержит значение, используя PHPUnit Временная зона файлов журналов PHP Как сломать строку заглавными буквами с помощью PHP? Метод проверки Zend \ Crypt \ Password \ BCrypt WooCommerce Новый электронный адрес электронной почты заказа для некоторых продуктов Слияние двух файлов xml на основе общего атрибута

mysql select и где над несколькими таблицами (очень сложно)

У меня есть 4 таблицы (см. Ниже) и нужно:

  1. получить последние 10 чатов из комнаты 3 без запрещенных пользователей
  2. показать псевдоним foruserid
  3. HIDE Пользователи $ userid не любят видеть таблицу "HIDE"

Таблица 1 "чаты"

ID(autoinc) fromuserid roomid text 1 23 3 bla 2 14 1 bla 3 11 3 bal 

Таблица 2 «пользователь» / shorted /

 ID(autoinc) nickname banned 1 chris 0 2 paul 1 // 1 = banned 

Таблица 3 "Скрыть"

 ID(autoinc) orguser hideuser 1 12 3 2 33 12 

Прямо сейчас я решил его с помощью PHP Routine, но мне нужно пройти КАЖДЫЙ результат и всегда делать новый запрос, который требует слишком много времени;

  $userid = 1; // actual user // List all chats and show userid as nickname $sql_com = "SELECT user.id, user.nickname, chats.text, chats.id ". " FROM chats, user". " WHERE ". " chats.fromuserid = user.id ". " AND chats.roomid = 3 ". " AND user.banned != 1 ". " ORDER BY chats.id DESC"; $result = mysql_query ($sql_com); $count = 0; while ($row = mysql_fetch_array($result, MYSQL_NUM)) { $dontshow = false; // Filter : dont show users $userid dont like to see (table "hide") $sql_com2 = "SELECT id from hide WHERE ( (orguser = ".$userid.") AND (hideuser = ".$row[0].") ) "; if ($result2 = mysql_query ($sql_com2)) { if (mysql_num_rows($result2) > 0) $dontshow = true; } // Output if ($dontshow == false) { $count++; echo "Nickname: ".$row[1]." Text: ".$row[2]; } if ($count > 10) break; } 

Btw. Я сделал некоторые улучшения, поэтому фактический вопрос может не соответствовать всем ответам (спасибо за вашу помощь до сих пор)

Завершите его сейчас, чтобы интегрировать фильтр «не показывать людей, перечисленных в таблице« скрыть »для моего фактического пользователя».

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

 SELECT c.ID, c.fromuserid, c.roomid, c.text, u.nickname FROM chats c JOIN user u ON c.fromuserid = u.id where c.roomid = 3 AND user.banned = 0 AND NOT EXISTS( SELECT * FROM hide h WHERE h.hideuser = c.fromuserid AND orguser = $userid) ORDER BY c.ID DESC LIMIT 0,10 

Не проверено, но это будет что-то вроде:

 $sql_com = "SELECT us.id, us.nickname, ch.text, ch.id ". " FROM chats ch, ". " user us, ". " hide hi, ". " banned ba, ". " WHERE ". " us.id != hi.hideuser ". " us.id != ba.user ". " us.id = ch.fromuserid ". " AND ch.roomid = 3 ". " ORDER BY ch.id DESC LIMIT 0,10"; 

Хотя я не могу сразу найти простой способ ответить на ваш вопрос как есть, я могу указать вам в правильном направлении:

http://dev.mysql.com/doc/refman/5.0/en/subqueries.html

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