Мне очень, очень не нравится публиковать ответы, которые я не проверял, но ради прогресса этого вопроса я сделаю удар.
"SELECT
a.id, a.feed, a.phone, a.time_stamp,
b.username,
c.imagenamesized,
COUNT(d.id) AS likes
FROM user_feeds a
INNER JOIN user_credentials b ON a.phone = b.phone
INNER JOIN profile_pic c ON a.phone = c.phone
LEFT JOIN user_feed_likes d ON a.id = d.feed_id
WHERE a.phone IN ('" . implode("',', $contact_owned) . "')
GROUP BY a.id
ORDER BY a.time_stamp DESC
LIMIT $offset, $limit"
Поскольку user_feed_likes
может содержать ноль "лайков" для определенного feed_id
, LEFT JOIN
является правильным JOIN
. Ваш синтаксис LEFT JOIN
должен отражать ваши INNER JOIN
s.
Используя GROUP BY
, вы генерируете совокупные данные, с которыми COUNT()
могут с удовольствием работать.
Чтобы сделать ваш запрос короче и потенциально легче для чтения, я рекомендую использовать псевдонимы таблиц (a
, b
, c
, d
). При объявлении псевдонимов вы можете написать ключевое слово AS
перед псевдонимом как синтаксический сахар, но я думаю, что более распространенным является его опускание.
Ваши $from
и $to
являются плохим выбором для имен переменных, потому что это не буквально данные, которые они содержат. $from
не страшно, но $to
потенциально вводит в заблуждение будущих читателей вашего кода. Вот почему я изменил его в своем фрагменте.
В соответствии с рекомендациями, вы всегда должны писать ключевые слова mysql во всех заглавных буквах для удобства чтения.
В порядке передовой практики вам следует избегать использования *
в вашем предложении SELECT
. Извлекайте данные только из тех столбцов, которые вы собираетесь использовать. Это позволит вам зациклить набор результатов и просто вставить полный $row
в $respond
без явного присвоения имен каждому столбцу [key]
.
Вы должны снова прочесать свой скрипт и убедиться, что вы последовательно используете объектно-ориентированный синтаксис mysqli. Смешивание процедурного и объектно-ориентированного не является лучшей практикой. Я предпочитаю объектно-ориентированный, потому что он более лаконичен.
Если вы не знаете, $result
может быть повторен напрямую с foreach()
без вызова fetch_assoc()
.
Избегайте объявления одноразовых переменных. Если вы просто помещаете данные в другой массив, сделайте это без промежуточных переменных.
Я не знаю, исходит ли ваш массив $contact_owned
(рассмотрите возможность переименования этой переменной, чтобы лучше описать содержащиеся в ней данные. Например, $user_phone_numbers
), поступивший от пользователя, но если он поступил из формы представление или другой ненадежный источник, тогда вы ДОЛЖНЫ реализовать подготовленное заявление о безопасности и стабильности. См. Этот пост, в котором говорится о построении подготовленного оператора с переменным числом заполнителей: https://stackoverflow.com/a/52323556/2943403
Если $contact_owned
получено из предыдущего запроса к базе данных, было бы более прямым сократить общее количество поездок в базу данных и просто написать логику WHERE
для фильтрации необходимых телефонных номеров пользователей с использованием идентификатора пользователя или чего-то еще вместо вашей текущей IN
логики. Это может даже позволить вам избежать сложного синтаксиса подготовленных операторов.