Этот урок набрал набрал достаточно большое количество комментариев и дальнейшее его комментирование отключено. Если вы хотели убедиться в правильности выполнения ДЗ или у вас возник вопрос по уроку, посмотрите ранее добавленные комментарии, кликнув по кнопке ниже. Скорее всего вы найдете там то, что искали. Если это не помогло - задайте вопрос в чате в телеграме - https://t.me/php_zone
Pavel-Tonk 18.12.2018 в 01:48

В теме "Вторая нормальная форма" - 2 пример, MySQL ругается на то что нет ";" в конце, а так же на "---" вместо "--"=)

--- Удалить дублирующие данные пользователей из таблицы customers
DELETE c1.* FROM customers AS c1 INNER JOIN customers AS c2 ON c1.telephone = c2.telephone WHERE c1.id > c2.id
ivashkevich 20.12.2018 в 09:23

Спасибо, поправил.

[email protected] 18.03.2019 в 19:00

DELETE c1.* FROM customers AS c1 INNER JOIN customers AS c2 ON c1.telephone = c2.telephone WHERE c1.id > c2.id;.Можете объяснить подробнее эту строчку.Что означает точка и звездочка и знак больше в конце?

85bogdan45 18.03.2019 в 23:54

Плюсую вопрос. Не понял откуда возникли с1, с2

[email protected] 18.03.2019 в 23:57

c1 и c2- псеводнимы, вроде как.

ivashkevich 19.03.2019 в 23:12

Это алиасы для таблицы customers.

ivashkevich 19.03.2019 в 23:12

Точка и звёздочка - это всё поля таблицы. Джойним табличку саму на себя. Находим записи с одинаковыми телефонами и удаляем ту, у которой id больше, чем у другой. Таким образом остается только одна запись для каждого номера.

[email protected] 19.03.2019 в 23:13

Спасибо,теперь ясно

fosfat 17.08.2019 в 22:31

А почему у вас в типе данных VARCHAR значение занимаемого объема стоит, например, 256, 1000, 500? В то время, как значение этого типа НЕ может быть больше 255, у вас же это даже указано в таблице статьи "Команды MySQL". Для длинных строк стоит использовать, например, TEXT и др.

То же самое наблюдаю в предыдущей и последующей статьях.

ivashkevich 18.08.2019 в 07:01

В современных версиях MySQL это ограничение гораздо больше.

fosfat 18.08.2019 в 14:15

Действительно. В официальной документации по последней 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".

[email protected] 08.12.2019 в 00:59

А связи покупатель-адрес? А вдруг покупатель может получать покупку по нескольким адресам, напр с понедельника по среду живет по одному адресу, а оставшиеся дни по другому и не хочет ждать определенной части недели для получения покупки? А вдруг одним телефоном пользуются несколько покупателей? Напр это рабочий телефон, и все работники не хотят светить свой личный, вот и регятся на рабочий?

ivashkevich 09.12.2019 в 03:45

Пожалуйста, вы можете улучшать структуру как угодно. Предлагаю вам сделать это самостоятельно в качестве домашнего задания.

X-Nick 26.02.2020 в 21:45

Я вот пока смотрю на структуру базы данных в целом - вижу что, где и куда. Как только нет перед глазами структур и связей таблиц - перед глазами туман. Это при любом изменении в БД нужно визуальное представление БД? Невозможно же это делать по памяти?) И насчет команд(особенно когда только это осваиваешь) - их нужно прямо помнить/запоминать наизусть или можно где-то иметь шпаргалки и подсматривать, если что?

ivashkevich 28.02.2020 в 05:03

Изменения как правило затрагивают несколько полей, и свободно помещаются в голову. При проектировании чего-то большого, что не помещается целиком в вашей голове, конечно стоит рисовать и визуализировать.
Команды запоминать нужно наизусть. Их не так много.

OLEG-M 13.04.2020 в 12:01

Попробовал ради прикола , сработало )

SELECT a.name, u.name, p.about FROM articles AS a INNER JOIN users AS u INNER JOIN profiles AS p ON a.author_id=u.id=p.id;

Изи!))

Спасибо за классные уроки.

ivashkevich 13.04.2020 в 14:58

Круто! На здоровье)

Fill 17.04.2020 в 19:46

Если не знаем id категории

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;
ivashkevich 18.04.2020 в 05:55

Супер!

YuraG 19.04.2020 в 13:03
 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='Новости о животных';
ivashkevich 19.04.2020 в 15:52

Отлично

studentDev 20.04.2020 в 10:18
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;

В принципе всё работает...

ivashkevich 20.04.2020 в 17:52

Отлично!

n.yurasheva 22.04.2020 в 11:48
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="Новости о животных";
ivashkevich 22.04.2020 в 12:15

Отлично

Timurik 27.04.2020 в 13:41

это если названия статей:

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="Новости о животных";
ivashkevich 27.04.2020 в 20:06

Отлично

titelivus 08.05.2020 в 06:48

Ух это было нелегко) но получилось)

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='Новости о животных';
ivashkevich 08.05.2020 в 20:20

Отлично

Sviatoslav 28.05.2020 в 21:22

Д/З

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="Новости о животных";
ivashkevich 29.05.2020 в 05:27

Отлично

[email protected] 04.06.2020 в 20:19
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 = "Новости о животных";
ivashkevich 06.06.2020 в 08:08

Отлично

IePyton 05.06.2020 в 12:16
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="Новости о животных"
ivashkevich 06.06.2020 в 08:20

Отлично

NR 23.06.2020 в 02:23
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

Спасибо за урок!

ivashkevich 23.06.2020 в 09:57

Отлично) На здоровье)

[email protected] 23.06.2020 в 23:08

Спасибо за урок.

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, не изменять привычке?

ivashkevich 24.06.2020 в 14:27

В PHP это оправдано тем, что данные внутри одинарных кавычек не подлежат парсингу. Здесь - без разницы.

[email protected] 02.08.2020 в 18:39

Добавим для каждого пользователя профиль:

INSERT INTO profiles (id, about, vk_link)
SELECT id, "Стрессоустойчивость, коммуникабельность", CONCAT("https://vk.com/id", id) FROM users;

А INSERT INTO не должен быть в паре с VALUES? Или как этот запрос работает?

ivashkevich 02.08.2020 в 19:05

Это отдельный statement - https://www.w3schools.com/sql/sql_insert_into_select.asp

X-Nick 15.08.2020 в 22:18

в первом сообщении цитаты про:

В теме "Вторая нормальная форма" - 2 пример, MySQL ругается на то что нет ";" в конце, а так же на "---" вместо "--"=)

Это откуда? Вроде по нормализацию нигде раньше не было, и примеров таких не было...

INSERT INTO profiles (id, about, vk_link)
SELECT id, "Стрессоустойчивость, коммуникабельность", CONCAT("https://vk.com/id", id) FROM users;

Что тут делает CONCAT?

ivashkevich 17.08.2020 в 06:29

В теме "Вторая нормальная форма" - 2 пример, MySQL ругается на то что нет ";" в конце, а так же на "---" вместо "--"=)

Не нашел таких слов в уроке. Вы о чем?

CONCAT берет id пользователя из таблицы users и добавляет его к ссылке в ВК

X-Nick 17.08.2020 в 11:26

Не нашел таких слов в уроке. Вы о чем?

Это из первого комментария к уроку. Наверное раньше содержимое урока было другим. И более объемным)

Ed8L 23.10.2020 в 10:31
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
Кстати, может стоит добавить пагинацию для комментариев?

ivashkevich 26.10.2020 в 05:40

Супер!
А для чего вам пагинация?

[email protected] 16.04.2021 в 12:02

Пагинацию не надо, а вот лайки и дизлайки можно, чтобы полезные комментарии наверх поднимались

maksim.kaz 31.10.2020 в 13:35
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="Новости о животных;
ivashkevich 31.10.2020 в 16:23

Отлично!

[email protected] 20.11.2020 в 14:30

Можно такой вопрос? Если у нас произвольное количество связей, то без таблицы связей и inner join видимо не обойтись. но если статей в перспективе много, а рублик - ограниченное количество, то с точки зрения оптимизации не лучше будет рублики собрать в массив, а связь органиовать отдельным столбцом в той же таблице с типом например bynary и соответственными where для select (и можно ли где-то почитать как это лучше сделать? Хотя наверное простое сравнение с числом типа аргХ2^Х+аргY2^Y+... сработает, а столбец тогда просто типа Int).

ivashkevich 23.11.2020 в 17:27

Не понял что вы хотите сделать. Можете чуть более конкретно сказать, что и в каком виде хотите положить вместо рубрик и как использовать?

[email protected] 23.11.2020 в 20:07

если есть 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 если не ошибаюсь.

ivashkevich 25.11.2020 в 21:26

Возможно и есть побитовая операция, я не искал. Можете погуглить самостоятельно. Но вообще, я бы создавал даже под такие объемы таблицы с обычными релейшенами.

[email protected] 26.11.2020 в 19:02

https://dev.mysql.com/doc/refman/8.0/en/bit-functions.html#operator_bitwise-or есть побитовые функции, но понял, в этом случае видимо тоже связи лучше

Larisa 22.11.2020 в 00:17
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;
ivashkevich 23.11.2020 в 17:35
SELECT * FROM articles_categories;

А это для чего?

Larisa 23.11.2020 в 20:35

Спасибо, случайно приклеилось.

[email protected] 03.12.2020 в 09:36

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 = 'Новости о животных';
ivashkevich 06.12.2020 в 07:31

Отлично!

[email protected] 11.12.2020 в 08:47

Я конечно долго мучился, но написал запрос.. Если добавится еще пару таблиц, голова пойдет кругом. Есть ли какой-то определенный порядок действий? (например разбить на более простые задачи) не пойму как и с чего начать.

ivashkevich 13.12.2020 в 07:32

Со временем всё будет восприниматься проще, будете не думая 5 джоинов писать

Ruslan2207 21.12.2020 в 17:14

Задание 1:

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 = 'Новости о животных';
ivashkevich 23.12.2020 в 07:24

Отлично

kan22 22.12.2020 в 17:41
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;
ivashkevich 23.12.2020 в 07:24

Отлично

Bulat 21.01.2021 в 00:10
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="Новости о животных";
ivashkevich 21.01.2021 в 06:24

Отлично!

[email protected] 22.01.2021 в 20:37
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 '%живот%'
ivashkevich 23.01.2021 в 20:27

Ок, можно было использовать id категории

[email protected] 23.01.2021 в 12:54
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 = 'новости о животных'
ivashkevich 23.01.2021 в 20:28

Отлично

Egor.Ka 13.03.2021 в 11:58

Мда, сперва запутался, что к чему соотносить)

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="Новости о животных"
ivashkevich 16.03.2021 в 09:57

Огонь!

[email protected] 07.04.2021 в 18:08

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="Новости о животных";

ivashkevich 08.04.2021 в 19:46

Не забывайте оформлять код. В остальном всё ок

dimadima 30.04.2021 в 18:03
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="Новости о животных";
ivashkevich 01.05.2021 в 17:47

Отлично

Логические задачи с собеседований