powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка по двум таблицам
7 сообщений из 7, страница 1 из 1
Выборка по двум таблицам
    #39954342
zhenia3003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите сделать выборку по двум таблицам, необходимо отобразить новости по количеству комментариев, т.е. новости с наибольшим кол-вом комментариев должны отображаться в начале списка . Имеются таблицы:
1. News (id, title, date) - таблица с новостями
2. Comments (id, material_id, text, date) - таблица с комментариями, где material_id - это уникальный id новости из таблицы news
Новости по дате вывожу следующим sql запросом:
SELECT * FROM news WHERE date <= NOW() order by date desc LIMIT 0, 20
...
Рейтинг: 0 / 0
Выборка по двум таблицам
    #39954432
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zhenia3003,
1) Что мешает использовать подсветку синтаксиса, размещая сообщение?
2) Что мешает не использовать служебные слова и называть поля БД разумно достаточно, например:
Код: sql
1.
2.
3.
4.
NewsTitle
NewsDate
CommentText
CommentDate


И т.д.
...
Рейтинг: 0 / 0
Выборка по двум таблицам
    #39954654
artas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zhenia3003
Помогите сделать выборку по двум таблицам, необходимо отобразить новости по количеству комментариев, т.е. новости с наибольшим кол-вом комментариев должны отображаться в начале списка . Имеются таблицы:
1. News (id, title, date) - таблица с новостями
2. Comments (id, material_id, text, date) - таблица с комментариями, где material_id - это уникальный id новости из таблицы news
Новости по дате вывожу следующим sql запросом:
SELECT * FROM news WHERE date <= NOW() order by date desc LIMIT 0, 20


Код: plsql
1.
2.
3.
4.
5.
6.
select id, title from (
SELECT n.in,n.title count(c.id) as cnt FROM 
news n
join Comments c on c.material_id = n.id
group by n.in,n.title 
) order by cnt desc
...
Рейтинг: 0 / 0
Выборка по двум таблицам
    #39954657
artas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluck99
zhenia3003,
1) Что мешает использовать подсветку синтаксиса, размещая сообщение?
2) Что мешает не использовать служебные слова и называть поля БД разумно достаточно, например:
Код: sql
1.
2.
3.
4.
NewsTitle
NewsDate
CommentText
CommentDate


И т.д.


по поводу второго не согласен
имя таблицы достаточно описывает что внутри. для остального есть алиасы. Я предпочитаю стандартные name, description вместо tableName_name etc
...
Рейтинг: 0 / 0
Выборка по двум таблицам
    #39954734
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artas
имя таблицы достаточно описывает что внутри. для остального есть алиасы. Я предпочитаю стандартные name, description вместо tableName_name etc
Во-первых, алиасы для сервера. На клиенте они бесполезны. Во-вторых, писать в выходном SELECT'е
Код: sql
1.
Name AS CustomerName, Name AS ProducerName, Name AS WhatEverName

занятие а-ля "дурная голова ногам покоя не даёт". В-третьих, читабельность кода повышается, если по имени поля сразу видно его принадлежность. И повторение имени таблицы в начале - это частный случай. Это необязательно так. В-четвертых, отладка больших запросов упрощается, потому что когда у вас 10 таблиц, и в каждой присутствует поле 'Name' и поле 'Date', риск получить неуловимую ошибку увеличивается.

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

Must read: Стив Макконнелл - "Совершенный код".
...
Рейтинг: 0 / 0
Выборка по двум таблицам
    #39954928
artas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluck99
artas
имя таблицы достаточно описывает что внутри. для остального есть алиасы. Я предпочитаю стандартные name, description вместо tableName_name etc
Во-первых, алиасы для сервера. На клиенте они бесполезны. Во-вторых, писать в выходном SELECT'е
Код: sql
1.
Name AS CustomerName, Name AS ProducerName, Name AS WhatEverName

занятие а-ля "дурная голова ногам покоя не даёт". В-третьих, читабельность кода повышается, если по имени поля сразу видно его принадлежность. И повторение имени таблицы в начале - это частный случай. Это необязательно так. В-четвертых, отладка больших запросов упрощается, потому что когда у вас 10 таблиц, и в каждой присутствует поле 'Name' и поле 'Date', риск получить неуловимую ошибку увеличивается.

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

Must read: Стив Макконнелл - "Совершенный код".

1+3) Алиасы дают ту же читабельность кода на клиенте dicName.title
2) Как минимум в энтерпрайзе это неактуально по причине обязательности ORM, там же где нужен нативный SQL, будет всякая аналитика и тд, в любом случае будет sum(),avg() etc() as smth
4) смотрите пункт 1. Это заставляет разработчика обращатся к таблицам через алиас, тем самым вырабатывая хороший тон, это лучше чем опиратся на безалиасное абстрактное название , при добавлении аналогичного в другую таблицу, все запросы перестанут работать. + для похожих справочников, есть возвожность обращатся полиморфно, а ля
select id,name from TABLE_NAME

Книга хорошая, но неиспользование алиасов в запросе на 10 таблиц хуже чем "неправильный", по вашему мнению, нейминг

P.S. Поля для soft delete тоже предлагаете назвать с именем таблицы ?
is_deleted vs is_news_deleted ?
is_deleted vs is_category_news_deleted
...
Рейтинг: 0 / 0
Выборка по двум таблицам
    #39954963
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artas
Книга хорошая, но неиспользование алиасов в запросе на 10 таблиц хуже чем "неправильный", по вашему мнению, нейминг
Я нигде не утверждал, что не надо использовать алиасы. Использовать алиасы для таблиц надо практически всегда. Для полей - по мере необходимости, в основном для вычисляемых и вытащенных из JOIN'ов.
Алиасы для таблиц обычно имеют короткие названия, одно-двух-трех буквенные сокращения от полного имени таблицы. Когда у вас в запросе собирается много данных, например, сложный составной справочник из 20-ти таблиц, у вас алиасы могут иметь вид:
Код: sql
1.
abc.Name, abs.Name, cbs.Name, bca.Name, drb.Name -- и так еще 15 таблиц

На следующий день вы уже забудете что какой алиас значит и будете бегать по коду глазами, чтобы понять, какое поле к какой таблице относится.
Можно, конечно, алиасы сделать более читабельными, но тогда они будут длинными, и всё преимущество алиасов будет сведено на нет. Это первое.
И второе. В конечном итоге все эти Name'ы надо будет 20 раз прописывать через Name AS MyNewName, т.к. независимо от того, используете вы алиасы для таблиц или нет, в результирующем наборе все одинаково названные поля будут синонимами, и вы либо получите ошибку, либо набор полей с говорящими именами Name1, Name2, Name3 и т.д. Зачем так делать, если можно указать уникальное имя поля сразу в CREATE и забыть об алиасах для полей, оставив их для вычисляемых выражений и ID?
Поэтому корректно моё утверждение звучит так: использование алиасов и правильный нейминг лучше, чем использование алиасов и непродуманный нейминг.
авторP.S. Поля для soft delete тоже предлагаете назвать с именем таблицы ?
is_deleted vs is_news_deleted ?
is_deleted vs is_category_news_deletedПожалуй, тут вы правы, вспомогательные булевы поля являются исключением, я их, в основном, оставляю как есть: Deleted, IsInSomething, etc. Но такие поля обычно не участвуют в больших выборках, где надо в результирующем SELECT собирать 10 полей Deleted (это какая-то специфическая задача). Они обычно сидят в WHERE или JOIN ON.
Но если булево поле не вспомогательное и пересекается с другими подобными полями, его имеет смысл именовать расширенным образом.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка по двум таблицам
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]