Запрос в MySQL
Добавил свойство функции $multiple, для приёма запроса в виде массива запросов. Сделал запрос на сообщения от друзей и запрос на глобальные сообщения (Get the user feed) в MySQL. Всё работает. Но мне ещё нужно было исключить из ленты заблокированного пользователя. Изменил запрос (Get the user feed 2). Теперь заблокированного пользователя нет в ленте, но теперь мне не нравится как выглядит последний запрос. Может кто нибудь сможет его поправить или изменить?
public function unique_multidim_array($array, $key) {
$temp_array = array();
$i = 0;
$key_array = array();
foreach($array as $val) {
if (!in_array($val[$key], $key_array)) {
$key_array[$i] = $val[$key];
$temp_array[$i] = $val;
}
$i++;
}
return $temp_array;
}
function getMessages($query, $type, $typeVal, $multiple = false) {
// QUERY: Holds the query string
// TYPE: [loadFeed, loadProfile, loadHashtags]
// TYPEVAL: Values for the JS functions
global $LNG, $CONF;
// Run the query
$result_array = array();
if(!$multiple){
$result = $this->db->query($query);
}else{
foreach ($query as $q) {
$result_array[] = $this->db->query($q);
}
}
// Set the result into an array
$rows = array();
if(!$multiple){
while($row = $result->fetch_assoc()) {
$rows[] = $row;
}
}else{
foreach ($result_array as $key => $value) {
while($row = $value->fetch_assoc()) {
$rows[] = $row;
}
}
}
$rows = $this->unique_multidim_array($rows, 'id');
// Get the user feed
$multiple = false;
if(empty($this->pages)) {
$multiple = true;
$query = array();
//запрос на глобальные сообщения с друзьями
$query[] = sprintf("(SELECT *
FROM `messages` USE INDEX(`news_feed`)
LEFT JOIN `users` ON `users`.`idu` = `messages`.`uid` AND `users`.`suspended` = 0
WHERE (`messages`.`uid` IN (%s)
AND `messages`.`page` = 0
AND `messages`.`group` = 0
AND `messages`.`public` != 0 %s%s)
ORDER BY `messages`.`id` DESC LIMIT %s)
UNION (SELECT *
FROM messages, users
WHERE users.suspended = 0
AND messages.group = 0
AND messages.public = 1
AND messages.public
AND messages.uid = users.idu %s %s
ORDER BY messages.id
DESC LIMIT %s)
ORDER BY `id` DESC LIMIT %s", $this->friendsList, $start, $from, ($this->per_page + 1), $start, $from, ($this->per_page + 1), ($this->per_page + 1));
}
$result = $this->getMessages($query, 'loadFeed', '\''.saniscape($value).'\'', $multiple);
return $result;
}
// Get the user feed // исключает из ленты заблокированного пользователя
$multiple = false;
if(empty($this->pages)) {
$multiple = true;
$query = array();
//запрос на глобальные сообщения с друзьями
$query[] = sprintf("(SELECT *,
IFNULL((SELECT GROUP_CONCAT(uid) from blocked WHERE `blocked`.`by`= %s), 0) AS blist
FROM `messages` USE INDEX(`news_feed`)
LEFT JOIN `users` ON `users`.`idu` = `messages`.`uid` AND `users`.`suspended` = 0
WHERE (`messages`.`uid` IN (%s)
AND `messages`.`page` = 0
AND `messages`.`group` = 0
AND `messages`.`public` != 0 %s%s)
ORDER BY `messages`.`id` DESC LIMIT %s)
UNION (SELECT *,
IFNULL((SELECT GROUP_CONCAT(uid) from blocked WHERE `blocked`.`by`= %s), 0) AS blist
FROM messages, users
WHERE users.suspended = 0
AND messages.group = 0
AND messages.public = 1
AND messages.public
AND messages.uid = users.idu %s %s
HAVING users.idu not in(blist)
ORDER BY messages.id
DESC LIMIT %s)
ORDER BY `id` DESC LIMIT %s", $this->id, $this->friendsList, $start, $from, ($this->per_page + 1), $this->id, $start, $from, ($this->per_page + 1), ($this->per_page + 1));
}