У меня есть 4 таблицы (см. Ниже) и нужно:
Таблица 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
Использование подзапросов должно позволить вам перейти и выбрать как заблокированные, так и скрытые таблицы и использовать те, которые указаны в исходном запросе.