Я понимаю, что вы хотите вычислить сумму разницы дней между датой начала и окончания по всем записям, относящимся к каждому сотруднику.
Вы действительно можете использовать агрегированный запрос с DATEDIFF и COALESCE:
SELECT
t1.emp_id,
t1.emp_name,
SUM(
COALESCE(
DATEDIFF(
COALESCE(t2.end_date, CURDATE()),
t2.start_date
),
0
) as total_days
FROM
table1 t1
LEFT JOIN table2 t2
ON t1.emp_id = t2.emp_id
GROUP BY
t1.emp_id,
t1.emp_name
В левом соединении избегает фильтрации записей, которые не могут быть сопоставлены в таблице2. DATEDIFF возвращает количество дней между двумя датами. Если любая из дат имеет значение NULL, возвращается NULL. Вы можете получить это с помощью COALESCE и вместо этого вернуть 0.
Всегда зависит контекста, но обычно, я храню пользовательское изображение в файловой системе в папке, названной /content/user/{user_id}.jpg
, и пытаюсь побеспокоить базу данных как можно меньше.
Как все другие сказали Вам, никогда не храните изображения в базе данных. Файловая система используется, чтобы хранить файлы->, изображения являются файлами->, хранят их в файловой системе :-)
Поскольку другие предложили:
, Почему?
, Чем больше Ваша база данных становится, тем медленнее это доберется. Хранение Вашего изображения в базе данных увеличит Ваш размер базы данных. Хранение имени файла увеличит Ваш размер базы данных.
Помещающие статические данные по другому серверу (псевдоним):
Я думаю, что большинство механизмов базы данных уже так совершенствуется, что хранение BLOB данных не производит недостатков (чрезмерно увеличенный в размере дб и т.д.). Одно преимущество состоит в том, что у Вас нет неработающих ссылок, когда изображение уже находится в базе данных. Однако я самостоятельно всегда делал так, чтобы я хранил файл на диске и дал URI базе данных. Это зависит от использования. Может быть легче обработать img в дб, если страница является очень динамичной и часто изменяется - никакое пространство имен - проблемы. Я должен сказать, что это заканчивается вниз, какому Вы предпочитаете.
Я предложил бы, чтобы Вы не хранили изображение в своем дб. Вместо этого, так как каждому пользователю будут связывать уникальный идентификатор с его профилем в дб, используйте тот идентификатор для хранения изображения физически на сервере.
, например, если у пользователя есть идентификатор 23, можно сохранить изображение в www.yourname.com/users/profile_images/23.jpg. Затем для отображения можно проверить, существует ли изображение, и отобразитесь, оно соответственно еще отображает универсальный значок.
Я недавно видел список этой подсказки: http://www.ajaxline.com/32-tips-to-speed-up-your-mysql-queries
Подсказка 17: Для Вашего веб-приложения изображения и другие двоичные активы должны обычно храниться как файлы. Таким образом, сохраните только ссылку на файл, а не сам файл в базе данных.
Поэтому просто сохраняют путь к файлу к изображению :)
Мы создали магазин, который сохранил изображения в DB. Это работало отлично во время разработки, но после того как мы протестировали его на рабочих серверах, время загрузки страницы было слишком высоко, и это добавило ненужную загрузку в серверы БД.
, В то время как это кажется привлекательным, чтобы хранить двоичные файлы в DB, выбирая и управляя ими, добавляет дополнительную сложность, которой можно избежать, просто сохранив файлы в файловой системе и храня пути / метаданные в DB.
Это - одни из тех вечных дебатов с превосходными аргументами с обеих сторон, но за мои деньги я держал бы изображения отдельно от DB.
Я рекомендовал бы хранить изображение как файл и затем имел бы файл URI в базе данных. При хранении всех изображений в базе данных у Вас могли бы быть некоторые проблемы с масштабированием позднее.
Выезд этот ответ также:
совет Microsoft для SQL Server раньше был, для скорости и размера, изображений хранилища в файловой системе, со ссылками в базе данных. Я думаю, что они смягчили свое предпочтение немного, но я все еще считаю это лучшей идеей, конечно, для размера, так как это не займет места в базе данных.
Накладные расходы, связанные с использованием BLOB, намного меньше, чем большинство людей могли бы поверить, особенно если бы вы настроили его правильно. Если вы используете отдельный сервер, на котором только запускается БД, для хранения бинарных файлов, то вы фактически можете вообще не использовать файловую систему и избежать накладных расходов со стороны файловой системы
Это говорит о том, что самый простой/лучший способ, если только у вас нет пары серверов, которые вы можете себе позволить, это хранить их в файловой системе
Не хранить абсолютный URL файла в вашей БД, только уникальную часть (и, возможно, папку или две), e. g. 2009/uniqueImageName.jpg
или просто uniqueImageName.jpg
.
Затем на ваших страницах просто добавьте хост и другие папки на фронт, таким образом у вас будет некоторая гибкость в перемещении ваших изображений - все, что вам нужно будет изменить - это строка или две на вашей PHP/ASP.NET странице.
Для безопасности нет необходимости хранить за пределами корня документа - . Файл htaccess
с DENY FROM ALL будет работать одинаково и обеспечит большую гибкость
Нет необходимости 'шунтировать' образы так много для безопасности, просто используйте getImage. php
или что-то в этом роде, а затем вместо того, чтобы вставить фактический URL в src
изображения , используйте что-то вроде
getImage.php?file=uniqueImageName.jpg
.
Тогда файл getImage.php
может проверить, авторизован ли пользователь, и получить изображение (или нет).
Используйте имя, которое гарантированно будет уникальным (желательно целое число, т.е. первичный ключ) при хранении, некоторую файловую систему (т.е. Windows) не чувствительны к регистру, поэтому JoeBloggs.jpg
и joebloggs.jpg
уникальны для базы данных, но не для файловой системы, поэтому можно перезаписать другой.
Используйте для образов отдельную таблицу и храните первичный ключ образа в таблице пользователей. Если вы когда-нибудь захотите добавить больше полей или внести изменения в будущем, это будет проще - это тоже хорошая практика.
Если вы беспокоитесь о SEO и подобных вещах, храните оригинальное имя файла изображения в другом поле во время загрузки, вы можете использовать это в своих выводах (например, в теге alt
).