101

Re: Вивчаю базу даних MySql

https://allwrong.wordpress.com/2008/03/ … ull-fails/

має працювати

Подякували: Анатолій1

102

Re: Вивчаю базу даних MySql

Не ламайте собі голову,виводьте так і все.

echo $row['model'].' '.(!empty($row['price']) ? $row['price'] : 'Модель відсутня').'<br>';
Подякували: quez, Анатолій2

103

Re: Вивчаю базу даних MySql

Я задачку переміг :)
Стаття Оператор CASE()

SELECT model, price,
    CASE 
    WHEN price=(SELECT MAX(price) FROM Product_PC ) THEN 'Ціна максимальна' 
    WHEN price=(SELECT MIN(price) FROM Product_PC ) THEN 'Ціна мінімальна' 
    WHEN price IS NULL THEN 'модель відсутня'
     ELSE price 
    END coment 
FROM Product_PC;

http://не-дійсний-домен/picture/task_case_02.jpg

104

Re: Вивчаю базу даних MySql

І в чому фішка? Глянув - наче все те саме, IS NULL .

105 Востаннє редагувалося ktretyak (20.02.2015 22:37:50)

Re: Вивчаю базу даних MySql

Схоже що дещо з найелементарнішого ви знаєте, тепер можу вам порадити наступне.

1. Використовуйте псевдоніми (аліаси) таблиць та полів, наприклад
[code=sql]select * from table as t[/code]
тут t є псевдонімом для таблиці table. І тепер ваш запит може бути таким select t.column from table. Надалі, коли ви працюватимете з декількома таблицями в одному запиті, оціните зручність.

2. Використовуйте join'и. Нариклад ваш запит, де ви хочете дізнатись максимальну чи мінімальну ціну, буде виконуватись абсолютно для всіх рядків.
[code=sql] WHEN price=(SELECT MAX(price) FROM Product_PC ) THEN 'Ціна максимальна' [/code]
Тобто якщо у вашій вибірці є 1000 рядків, то відповідно 1000 разів буде шукатись одне і теж значення.

Взагалі то, якщо ви працюєте безпосередньо у SQL-редакторі, можна обійтись і константою, яку передавати через MySQL'івську глобальну змінну (довільна глобальна змінна починається знаком @), наприклад так
[code]select
    @max_price:=max(price)
    ,@min_price:=min(price)
from Product_PC;

SELECT model, price,
    CASE
    WHEN price=@max_price THEN 'Ціна максимальна'
    WHEN price=@min_price THEN 'Ціна мінімальна'
    WHEN price IS NULL THEN 'модель відсутня'
    ELSE price
    END coment
FROM Product_PC;[/code]
Але з цими глобальними змінними можуть бути проблеми, якщо ви хочете працювати, наприклад, через PHP, бо там треба враховувати сесії підключення... В такому разі краще писати так
[code=sql]SELECT
    p.model
    ,p.price
    ,CASE
        WHEN p.price = m.max_price THEN 'Ціна максимальна' -- тут порівнюються дані з таблиць "p" та "m"
        WHEN p.price = m.min_price THEN 'Ціна мінімальна'
        WHEN p.price IS NULL THEN 'модель відсутня'
        ELSE price
    END coment
FROM Product_PC as p -- тепер до Product_PC можна звертатись через "p"
    left join
    (
        select
            model
            ,max(price) as max_price
            ,min(price) as min_price
        from Product_PC
        group by
            model
    ) as m  -- тепер до цього внутрішнього запиту можна звертатись через "m"
        on p.model = m.model[/code]

3. Використовуйте оператор explain перед select, щоб побачити план виконання даного конкретного запиту.

З третім пунктом можливо вам ще зарано особливо розбиратись, але вже можна поглядати, щоб знати що такий інструмент оптимізації є.

Подякували: Анатолій1

106

Re: Вивчаю базу даних MySql

Sensetivity написав:

І в чому фішка? Глянув - наче все те саме, IS NULL .

http://не-дійсний-домен/picture/tasks_010.jpg

Моя думка, власне проблема чому не працює CASE() в одному із запитів, як сказано в посиланні що ти давав

So, why didn’t the original work?
Because NULL means unknown
Because NULL does not equal NULL
Because NULL is just weird, weird, weird

NULL це Невідоме, і порівнювати ціну з незрозуміло з чим машина не вміє,.. але ж в іншому запиті ціна теж порівнюється з NULL??? і чому працює, ну толком я чесно не знаю :(

P.S. Може добрі люди скажуть :)

107

Re: Вивчаю базу даних MySql

ktretyak написав:

Схоже що дещо з найелементарнішого ви знаєте, тепер можу вам порадити наступне.
....
З третім пунктом можливо вам ще зарано особливо розбиратись, але вже можна поглядати, щоб знати що такий інструмент оптимізації є.

Дякую досить толково сказано, попрактикую методики....

108

Re: Вивчаю базу даних MySql

Стосовно вашого "непрацюючого" запиту

SELECT model,price, 
CASE price 
WHEN (SELECT MAX(price) FROM Product_PC) THEN 'Найбільша ціна' 
WHEN (SELECT MIN(price) FROM Product_PC) THEN 'Найменша ціна'
WHEN price IS NULL THEN 'Модель відсутня'
ELSE 'Середня ціна' 
END comment
FROM Product_PC

Варіант синтаксису, коли в заголовку case спочатку прописують поле, а потім у when прописують значення, працює з використанням оператора "=" (дорівнює).

В даному разі, те що ви записали WHEN price IS NULL THEN 'Модель відсутня' інтерпретується приблизно так: "коли price = price is null then ..."

Коли вам треба перевіряти значення не за допомогою оператора "=", то використовуйте інший синтаксис case

Подякували: Arete1

109

Re: Вивчаю базу даних MySql

ktretyak написав:

В даному разі, те що ви записали WHEN price IS NULL THEN 'Модель відсутня' інтерпретується приблизно так: "коли price = price is null then ..."

Прихований текст
SELECT model,price, 
CASE price 
WHEN (SELECT MAX(price) FROM Product_PC) THEN 'Найбільша ціна' 
WHEN (SELECT MIN(price) FROM Product_PC) THEN 'Найменша ціна'
WHEN NULL THEN 'Модель відсутня'
ELSE 'Середня ціна' 
END comment
FROM Product_PC

якщо в рядку price = null

то згідно перевірки  "null = null then 'Модель відсутня'" результат все рівно "Середня ціна"
загалом як на мене NULL просто .... just weird, weird, weird :)

110

Re: Вивчаю базу даних MySql

та ні, null просто ніколи не порівнюється через =, завжди через is null

Подякували: Анатолій1

111

Re: Вивчаю базу даних MySql

ktretyak написав:

та ні, null просто ніколи не порівнюється через =, завжди через is null

Я пізніше в три години ночі :) так і подумав, що null визначається через функції IS NULL, а не через  "="

112

Re: Вивчаю базу даних MySql

Порівняння з null оператором "=" завжди дає false, навіть у випадку  null = null. Коли "незрозуміло що" порівнюється з "незрозуміло що" вважається що це два різні "незрозуміло що".

Подякували: Анатолій1

113

Re: Вивчаю базу даних MySql

Шановне панство програмістів, розглядаю задачку, рішення списав як в школі :), буду мотивувати тим, що аналізую яким чином інші розв'язують задачки а згодом і сам  сподіваюсь зможу пропонувати, яким чином можна буде вирішити завдання.

Порахувати кількість рейсів перевезення вантажу, відправлення яких було з міста Миколаїв до міста Київ та кількість рейсів з міста Миколаїв за іншими напрямками з таблиці Перевезення вантажу;

http://не-дійсний-домен/picture/tasks_011.jpg

1. в даному завданні мені незрозуміло що за "Х", що цей символ виконує, але без нього ніяк видає помилку.

114 Востаннє редагувалося ktretyak (21.02.2015 11:38:49)

Re: Вивчаю базу даних MySql

То у вас такий псевдонім виразу, що записано в дужках перед ним - це те що я вам рекомендував використовувати.

Ви там можете записати будь-яку вподобану назву, але якщо ви її не берете в лапки, то допускаються лише літери та символи підкреслення. Перед псевдонімом не обов'язково ще дописують as, тобто (тут внутрішній селект) as x

Спробуйте в HeidiSQL, в тій базі де у вас знаходиться ваша таблиця transportation, записати таке:
[code=sql]select * from transportation as t[/code]
Тобто ви для довгої назви своєї таблиці зазначили коротку назву t. А тепер спробуйте видалити зірочку, написати цей псевдонім з крапкою і почекати секунду
[code=sql]select t. from transportation as t[/code]

Подякували: Анатолій1

115

Re: Вивчаю базу даних MySql

Хай менс,
таке завдання ... я вирішив ось так... , можливо є гарніше рішення?
чергове завдання

Є дві таблиці:
- users - користувачі (users_id, name)
- orders - замовлення (orders_id, users_id, status)
1) Вибрати всіх користувачів з таблиці users, в яких ВСІ записи в таблиці orders мають status = 0;
2) Вибрати Id, ім'я, та кількість замовлень всіх користувачів з таблиці users, в яких 3 і більше записів поля 'status' = '1' в таблиці orders

1.

SELECT u.users_id AS Id,u.users_name AS Name 
FROM orders o 
JOIN users u 
ON o.users_id=u.users_id 
WHERE o.status = 0 
GROUP BY o.users_id ;

2.

SELECT u.users_id AS Id,u.users_name AS Name, COUNT(o.status) AS Count 
FROM orders o 
JOIN users u 
ON o.users_id=u.users_id 
WHERE o.status = 1 
GROUP BY o.users_id 
HAVING COUNT(o.status) >= 3

116

Re: Вивчаю базу даних MySql

У першому рішенні ти береш тільки ті замовлення, де статус 0, а не де всі замовлення мають статус 0.

Подякували: Анатолій1

117 Востаннє редагувалося Анатолій (22.02.2015 18:47:13)

Re: Вивчаю базу даних MySql

Sensetivity написав:

У першому рішенні ти береш тільки ті замовлення, де статус 0, а не де всі замовлення мають статус 0.

:) гаразд, можна розглянути два варіанти
1.1.) Логічно було б вибрати звіт Користувачів, в кого замовлення не виконані (статус 0).- цей варіант рахуй виконаний вище. Тобто товар не продали - Петя, Маша, Саша...
1.2.) Показати ВСІ Id замовлень та відповідних Користувачів, в кого замовлення не виконані (статус=0).- підходить безпосередньо під питання завдання. Тобто не проданий товар такий, такий і такий, тому премію нарахувати йому йому і ось цьому працівнику :)

зараз подумаю відкоректую.
SQL-запит для  завдання 1.2

SELECT o.orders_id , o.users_id ,u.users_name AS Name 
FROM orders_01 o 
JOIN users_01 u 
ON o.users_id=u.users_id 
WHERE o.status = 0 

P.S. Відкоректую нехай буде три питання.

118 Востаннє редагувалося Анатолій (01.03.2015 22:25:28)

Re: Вивчаю базу даних MySql

Графік з даних БД

Підкаже хтось яким чином реалізувати графік даних на сайт?

Скажімо, для прикладу, якщо є дані температури повітря за якесь там число, і я хотів би побудувати графік на веб-сторінці, яким чином це оптимально реалізувати?
А якщо онлайн температуру будувати, це сильно навантажує сервер чи інші потужності?


P.S. Залишу графіки дещо на пізніше.
Кожне навчання має завершуватись проектом, що підтверджує наявність якогось рівня знань.
Придумав собі вихідний проект, щось на зразок "Представлення на веб-сайті автоматизованої системи опалювання приватного будинку"

http://не-дійсний-домен/ForumReplace/cursova.jpg

119

Re: Вивчаю базу даних MySql

http://www.jscharts.com/examples

Подякували: Анатолій1

120

Re: Вивчаю базу даних MySql

Нормалізація Баз Даних

Декілька раз зустрів поняття нормалізація/денормалізація Баз Даних,...
так собі думаю це поняття скоріше має відношення до проектування Баз Даних, тобто самий початок....
ну та гаразд.... почитаю що з цього приводу каже інтернет.

Можливо хто простими словами розкаже що це за сіль така? І чи є необхідність витрачати час і зусилля на цю сутність БД?