Как соединить две таблицы с отношением 1-ко-многим и получить COUNT ()?

Вы не можете. Ну, функция postfix в основном является Postfix Plugin для IntelliJ (теперь интегрирована). Все шаблоны являются только скомпилированным кодом, как вы можете видеть здесь:

https://github.com/controlflow/intellij-postfix/tree/master/src/org/jetbrains/postfixCompletion/templates

К сожалению, нет такой простой xml-конфигурации. : (

1
задан mickmackusa 19 January 2019 в 04:20
поделиться

1 ответ

Мне очень, очень не нравится публиковать ответы, которые я не проверял, но ради прогресса этого вопроса я сделаю удар.

"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, a LEFT JOIN является правильным JOIN. Ваш синтаксис LEFT JOIN должен отражать ваши INNER JOIN с.

Используя 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. Это может даже позволить вам избежать сложного синтаксиса подготовленных операторов.

0
ответ дан mickmackusa 19 January 2019 в 04:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: