Этот урок набрал набрал достаточно большое количество
комментариев и дальнейшее его комментирование отключено.
Если вы хотели убедиться в правильности выполнения ДЗ или у вас возник вопрос по уроку,
посмотрите ранее добавленные комментарии, кликнув по кнопке ниже. Скорее всего вы найдете там то, что искали.
Если это не помогло - задайте вопрос в чате в телеграме - https://t.me/php_zone
В теме "Вторая нормальная форма" - 2 пример, MySQL ругается на то что нет ";" в конце, а так же на "---" вместо "--"=)
--- Удалить дублирующие данные пользователей из таблицы customers
DELETE c1.* FROM customers AS c1 INNER JOIN customers AS c2 ON c1.telephone = c2.telephone WHERE c1.id > c2.id
DELETE c1.* FROM customers AS c1 INNER JOIN customers AS c2 ON c1.telephone = c2.telephone WHERE c1.id > c2.id;.Можете объяснить подробнее эту строчку.Что означает точка и звездочка и знак больше в конце?
Точка и звёздочка - это всё поля таблицы. Джойним табличку саму на себя. Находим записи с одинаковыми телефонами и удаляем ту, у которой id больше, чем у другой. Таким образом остается только одна запись для каждого номера.
А почему у вас в типе данных VARCHAR значение занимаемого объема стоит, например, 256, 1000, 500? В то время, как значение этого типа НЕ может быть больше 255, у вас же это даже указано в таблице статьи "Команды MySQL". Для длинных строк стоит использовать, например, TEXT и др.
То же самое наблюдаю в предыдущей и последующей статьях.
Действительно. В официальной документации по последней 8 версии указано, что диапазон значений от 0 до 65,535. Цитата: "Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 65,535".
А связи покупатель-адрес? А вдруг покупатель может получать покупку по нескольким адресам, напр с понедельника по среду живет по одному адресу, а оставшиеся дни по другому и не хочет ждать определенной части недели для получения покупки? А вдруг одним телефоном пользуются несколько покупателей? Напр это рабочий телефон, и все работники не хотят светить свой личный, вот и регятся на рабочий?
Я вот пока смотрю на структуру базы данных в целом - вижу что, где и куда. Как только нет перед глазами структур и связей таблиц - перед глазами туман. Это при любом изменении в БД нужно визуальное представление БД? Невозможно же это делать по памяти?) И насчет команд(особенно когда только это осваиваешь) - их нужно прямо помнить/запоминать наизусть или можно где-то иметь шпаргалки и подсматривать, если что?
Изменения как правило затрагивают несколько полей, и свободно помещаются в голову. При проектировании чего-то большого, что не помещается целиком в вашей голове, конечно стоит рисовать и визуализировать.
Команды запоминать нужно наизусть. Их не так много.
SELECT a.name, a.text FROM articles AS a
INNER JOIN articles_categories AS ac ON ac.article_id=a.id
INNER JOIN categories AS c ON c.id=ac.category_id
WHERE c.name="Новости о животных";
Если знаем id категории
SELECT a.name, a.text FROM articles AS a
INNER JOIN articles_categories AS ac ON ac.article_id=a.id
WHERE ac.category_id = 3;
SELECT a.name FROM articles AS a INNER JOIN articles_categories AS ac ON a.id=ac.article_id INNER JOIN categories AS c ON ac.category_id=c.id WHERE c.name='Новости о животных';
SELECT a.name FROM articles AS a INNER JOIN articles_categories AS ac ON ac.article_id=a.id INNER JOIN categories AS c ON ac.category_id=c.id WHERE c.id=3;
SELECT a.name, a.text FROM articles AS a
INNER JOIN articles_categories AS ac ON ac.article_id=a.id
INNER JOIN categories AS c ON c.id=ac.category_id
WHERE c.name="Новости о животных";
SELECT a.name FROM categories AS c
INNER JOIN articles_categories AS ac ON ac.category_id=c.id
INNER JOIN articles AS a ON a.id=ac.article_id
WHERE c.name="Новости о животных";
а это если текст статей
SELECT a.text FROM categories AS c
INNER JOIN articles_categories AS ac ON ac.category_id=c.id
INNER JOIN articles AS a ON a.id=ac.article_id
WHERE c.name="Новости о животных";
SELECT a.name FROM articles AS a
INNER JOIN articles_categories AS ac ON a.id=ac.article_id
INNER JOIN categories AS c ON c.id=ac.category_id
WHERE c.name='Новости о животных';
SELECT a.name, a.text FROM articles AS a
INNER JOIN articles_categories AS ac ON ac.category_id=a.id
INNER JOIN categories AS c ON c.id=ac.article_id
WHERE c.name="Новости о животных";
SELECT a.name FROM articles AS a
INNER JOIN articles_categories AS ac ON a.id = ac.article_id
INNER JOIN categories AS c ON c.id = ac.category_id
WHERE c.name = "Новости о животных";
SELECT a.name FROM `articles` AS a
INNER JOIN articles_categories AS ac ON ac.article_id=a.id
INNER JOIN categories AS c ON c.id = ac.category_id
WHERE c.name="Новости о животных"
SELECT a.name FROM articles AS a INNER JOIN articles_categories AS ac ON ac.article_id=a.id INNER JOIN categories AS c ON c.id=ac.category_id WHERE c.id=3
SELECT a.name FROM articles AS a INNER JOIN articles_categories AS ac ON a.id = ac.article_id INNER JOIN categories AS c ON ac.category_id = c.id WHERE c.name = 'Новости о животных';
Подскажите, пж, вы используете в примерах двойные кавычки, но, вроде, и с одинарными все отрабатывает. В PHP уроках привык одинарные ставить, можно и здесь, в SQL, не изменять привычке?
SELECT a.name, a.text FROM articles AS a
INNER JOIN articles_categories AS ac ON ac.article_id=a.id
INNER JOIN categories AS c ON c.id=ac.category_id
WHERE c.name="Новости о животных";
Сначала не понял и уже хотел просто переходить к следующему уроку. Но все-таки решил разобраться и оказывается всё очень легко :D
Кстати, может стоит добавить пагинацию для комментариев?
SELECT a.name FROM categories AS c
INNER JOIN articles_categories AS ac ON ac.category_id=c.id
INNER JOIN articles AS a ON a.id=ac.article_id
WHERE c.name="Новости о животных;
Можно такой вопрос? Если у нас произвольное количество связей, то без таблицы связей и inner join видимо не обойтись. но если статей в перспективе много, а рублик - ограниченное количество, то с точки зрения оптимизации не лучше будет рублики собрать в массив, а связь органиовать отдельным столбцом в той же таблице с типом например bynary и соответственными where для select (и можно ли где-то почитать как это лучше сделать? Хотя наверное простое сравнение с числом типа аргХ2^Х+аргY2^Y+... сработает, а столбец тогда просто типа Int).
если есть 100000 статей и 15 рублик, и для каждой статьи их 3-4, то получится таблица связей из 300000 строк. что оптимальнее - такая таблица и inner join или столбец "рублика" в таблице с каким-нибудь мат оператором в where, который организует выборку по рубликам? нет ли чего-либо типа побитового "или" в mysql? или оптимальнее все таки большая талица связей и inner join?
то есть что лучше (например для одной связи x) - select from articles as a inner join articles_categories as c on a.id = c.article_id where c.category_id = x или select from articles where (в столбце category есть бит номер x)?
в конце концов проверка бита х вроде как нечетность целочисленного деления на х^2 если не ошибаюсь.
Возможно и есть побитовая операция, я не искал. Можете погуглить самостоятельно. Но вообще, я бы создавал даже под такие объемы таблицы с обычными релейшенами.
SELECT a.name FROM articles AS a
INNER JOIN articles_categories AS ac ON ac.categories_id=a.id
INNER JOIN categories AS c ON c.id=ac.article_id
WHERE c.id=3;
SELECT * FROM articles_categories;
select ar.name from articles ar inner join articles_categories ac on ar.id = ac.category_id
inner join categories ca on ac.article_id = ca.id and ca.name = 'Новости о животных';
Я конечно долго мучился, но написал запрос.. Если добавится еще пару таблиц, голова пойдет кругом. Есть ли какой-то определенный порядок действий? (например разбить на более простые задачи) не пойму как и с чего начать.
select a.name from articles as a inner join articles_categories as ac on a.id = ac.article_id inner join categories as c on ac.category_id = c.id where c.name = 'Новости о животных';
SELECT a.name, a.text FROM articles AS a
INNER JOIN articles_categories AS ac ON ac.article_id=a.id
INNER JOIN categories AS c ON c.id=ac.category_id
WHERE c.id=3;
SELECT a.name FROM articles AS a INNER JOIN articles_categories AS ac ON a.id=ac.article_id INNER JOIN categories AS c ON ac.category_id=c.id WHERE c.name="Новости о животных";
select a.name, a.text from articles as a
inner JOIN articles_categories as a_c on a.id=a_c.article_id
inner JOIN categories as c on c.id=a_c.category_id
WHERE c.name LIKE '%живот%'
SELECT
a.NAME,
a.text
FROM
articles AS a
INNER JOIN articles_categories AS a_c ON a.id = a_c.article_id
INNER JOIN categories AS c ON c.id = a_c.category_id
WHERE
c.NAME = 'новости о животных'
SELECT a.name, a.text FROM articles AS a
INNER JOIN articles_categories AS ac ON ac.article_id=a.id
INNER JOIN categories AS c ON c.id=ac.category_id
WHERE c.name="Новости о животных"
SELECT a.name, a.text FROM articles AS a
INNER JOIN articles_categories AS ac ON ac.category_id=a.id
INNER JOIN categories AS c ON c.id=ac.article_id
WHERE c.name="Новости о животных";
SELECT a.name FROM articles AS a
INNER JOIN articles_categories AS ac ON ac.category_id=a.id
INNER JOIN categories AS c ON c.id=ac.article_id
WHERE c.name="Новости о животных";
В теме "Вторая нормальная форма" - 2 пример, MySQL ругается на то что нет ";" в конце, а так же на "---" вместо "--"=)
Спасибо, поправил.
DELETE c1.* FROM customers AS c1 INNER JOIN customers AS c2 ON c1.telephone = c2.telephone WHERE c1.id > c2.id;.Можете объяснить подробнее эту строчку.Что означает точка и звездочка и знак больше в конце?
Плюсую вопрос. Не понял откуда возникли с1, с2
c1 и c2- псеводнимы, вроде как.
Это алиасы для таблицы customers.
Точка и звёздочка - это всё поля таблицы. Джойним табличку саму на себя. Находим записи с одинаковыми телефонами и удаляем ту, у которой id больше, чем у другой. Таким образом остается только одна запись для каждого номера.
Спасибо,теперь ясно
А почему у вас в типе данных VARCHAR значение занимаемого объема стоит, например, 256, 1000, 500? В то время, как значение этого типа НЕ может быть больше 255, у вас же это даже указано в таблице статьи "Команды MySQL". Для длинных строк стоит использовать, например, TEXT и др.
То же самое наблюдаю в предыдущей и последующей статьях.
В современных версиях MySQL это ограничение гораздо больше.
Действительно. В официальной документации по последней 8 версии указано, что диапазон значений от 0 до 65,535. Цитата: "Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 65,535".
А связи покупатель-адрес? А вдруг покупатель может получать покупку по нескольким адресам, напр с понедельника по среду живет по одному адресу, а оставшиеся дни по другому и не хочет ждать определенной части недели для получения покупки? А вдруг одним телефоном пользуются несколько покупателей? Напр это рабочий телефон, и все работники не хотят светить свой личный, вот и регятся на рабочий?
Пожалуйста, вы можете улучшать структуру как угодно. Предлагаю вам сделать это самостоятельно в качестве домашнего задания.
Я вот пока смотрю на структуру базы данных в целом - вижу что, где и куда. Как только нет перед глазами структур и связей таблиц - перед глазами туман. Это при любом изменении в БД нужно визуальное представление БД? Невозможно же это делать по памяти?) И насчет команд(особенно когда только это осваиваешь) - их нужно прямо помнить/запоминать наизусть или можно где-то иметь шпаргалки и подсматривать, если что?
Изменения как правило затрагивают несколько полей, и свободно помещаются в голову. При проектировании чего-то большого, что не помещается целиком в вашей голове, конечно стоит рисовать и визуализировать.
Команды запоминать нужно наизусть. Их не так много.
Попробовал ради прикола , сработало )
Изи!))
Спасибо за классные уроки.
Круто! На здоровье)
Если не знаем id категории
Если знаем id категории
Супер!
Отлично
В принципе всё работает...
Отлично!
Отлично
это если названия статей:
а это если текст статей
Отлично
Ух это было нелегко) но получилось)
Отлично
Д/З
Отлично
Отлично
Отлично
Спасибо за урок!
Отлично) На здоровье)
Спасибо за урок.
Подскажите, пж, вы используете в примерах двойные кавычки, но, вроде, и с одинарными все отрабатывает. В PHP уроках привык одинарные ставить, можно и здесь, в SQL, не изменять привычке?
В PHP это оправдано тем, что данные внутри одинарных кавычек не подлежат парсингу. Здесь - без разницы.
Добавим для каждого пользователя профиль:
А INSERT INTO не должен быть в паре с VALUES? Или как этот запрос работает?
Это отдельный statement - https://www.w3schools.com/sql/sql_insert_into_select.asp
в первом сообщении цитаты про:
Это откуда? Вроде по нормализацию нигде раньше не было, и примеров таких не было...
Что тут делает CONCAT?
Не нашел таких слов в уроке. Вы о чем?
CONCAT берет id пользователя из таблицы users и добавляет его к ссылке в ВК
Это из первого комментария к уроку. Наверное раньше содержимое урока было другим. И более объемным)
Сначала не понял и уже хотел просто переходить к следующему уроку. Но все-таки решил разобраться и оказывается всё очень легко :D
Кстати, может стоит добавить пагинацию для комментариев?
Супер!
А для чего вам пагинация?
Пагинацию не надо, а вот лайки и дизлайки можно, чтобы полезные комментарии наверх поднимались
Отлично!
Можно такой вопрос? Если у нас произвольное количество связей, то без таблицы связей и inner join видимо не обойтись. но если статей в перспективе много, а рублик - ограниченное количество, то с точки зрения оптимизации не лучше будет рублики собрать в массив, а связь органиовать отдельным столбцом в той же таблице с типом например bynary и соответственными where для select (и можно ли где-то почитать как это лучше сделать? Хотя наверное простое сравнение с числом типа аргХ2^Х+аргY2^Y+... сработает, а столбец тогда просто типа Int).
Не понял что вы хотите сделать. Можете чуть более конкретно сказать, что и в каком виде хотите положить вместо рубрик и как использовать?
если есть 100000 статей и 15 рублик, и для каждой статьи их 3-4, то получится таблица связей из 300000 строк. что оптимальнее - такая таблица и inner join или столбец "рублика" в таблице с каким-нибудь мат оператором в where, который организует выборку по рубликам? нет ли чего-либо типа побитового "или" в mysql? или оптимальнее все таки большая талица связей и inner join?
то есть что лучше (например для одной связи x) - select from articles as a inner join articles_categories as c on a.id = c.article_id where c.category_id = x или select from articles where (в столбце category есть бит номер x)?
в конце концов проверка бита х вроде как нечетность целочисленного деления на х^2 если не ошибаюсь.
Возможно и есть побитовая операция, я не искал. Можете погуглить самостоятельно. Но вообще, я бы создавал даже под такие объемы таблицы с обычными релейшенами.
https://dev.mysql.com/doc/refman/8.0/en/bit-functions.html#operator_bitwise-or есть побитовые функции, но понял, в этом случае видимо тоже связи лучше
А это для чего?
Спасибо, случайно приклеилось.
Отлично!
Я конечно долго мучился, но написал запрос.. Если добавится еще пару таблиц, голова пойдет кругом. Есть ли какой-то определенный порядок действий? (например разбить на более простые задачи) не пойму как и с чего начать.
Со временем всё будет восприниматься проще, будете не думая 5 джоинов писать
Задание 1:
Отлично
Отлично
Отлично!
Ок, можно было использовать id категории
Отлично
Мда, сперва запутался, что к чему соотносить)
Огонь!
SELECT a.name, a.text FROM articles AS a
INNER JOIN articles_categories AS ac ON ac.category_id=a.id
INNER JOIN categories AS c ON c.id=ac.article_id
WHERE c.name="Новости о животных";
Не забывайте оформлять код. В остальном всё ок
Отлично