select last_move.book_id, last_move.rack_id, last_move.board_id, -- последнее местонахождение книги
first_move.date_from, -- дата первого появления на складе
last_move.date_to -- дата последнего перемещения
from
-- подзапрос, получаем первые записи появления каждой книги на складе
(select *
from (select t.*, rank() over (partition by t.book_id order by t.date_from) rnk
from table t)
where rnk = 1) first_move
join
-- подзапрос, получаем последние записи перемещения каждой книги на складе
(select *
from (select t.*, rank() over (partition by t.book_id order by t.date_from DESC) rnk
from table t)
where rnk = 1) last_move
-- сопоставляем записи
on first_move.book_id = last_move.book_id
$sql = "insert into table_name(name) value('".$str_param."')";
$sql = "insert into table_name(name) value(:param1)"; //текст запроса с метками для вставки параметров;
$prep_sql = $sqlconnect->prepare($sql); //подготовка SQL-запроса, фактически, синтаксический разбор и выявление меток, куда вставлять параметры, проверка ошибок;
$prep_sql->bindParam('param1', $str_param, STRING_TYPE); //связываем параметры с метками в запросе, проверяем тип входного параметра;
$prep_sql->execute(); //выполняем запрос
SELECT t.event_date, -- атрибут таблицы типа datetime, для которого определяем интервал, выведен для того, чтобы наблюдать за процессом отладки
case -- SQL-конструкция вида "case when ... then ... else ... end", с помощью которой можно выводить не только конкретное значение атрибута, но и задавать условие, при котором конечное значение результата будет вычисляться по-разному в пределах одной выбранной записи.
when TIME_TO_SEC(t.event_date) >= inter.begin AND TIME_TO_SEC(t.event_date) <= inter.end -- если t.event_date, выраженное в суточных секундах, находится в отрезке [inter.begin, inter.end], также выраженных в суточных секундах,...
then floor((TIME_TO_SEC(t.event_date) - inter.begin) / inter.width) -- ... то вычисляем количество полных интервалов
else null -- иначе, если время не попадает в период отслеживания, то выводим "пусто", чтобы явно указать, что значение не находится в интересуемом периоде
end as full_interval_number -- кол-во прошедших полных интервалов, начинается с 0
FROM table t, -- ваша таблица
(select TIME_TO_SEC('09:00:00') as begin, -- начало дневного периода
TIME_TO_SEC('18:00:00') as end, -- конец дневного периода
TIME_TO_SEC('00:15:00') as width -- ширина интервала
) inter -- параметрический подзапрос, все настраиваемые константы в одном месте - удобно при отладке
order by case
when :order_param = 1 then col_1
when :order_param = 2 then col_2
end,
case
when :order_param = 1 then col_2
when :order_param = 2 then col_1
end
SELECT *
from (SELECT servers.id,
servers.game,
servers.votes,
@n := @n + 1 AS rank
FROM servers, (SELECT @n := 0) r
ORDER BY servers.votes DESC) a
where id = 3
/*Функция преобразования выборки в матрицу */
function get_matrix($rows)
{
// получаем все значения по id - измерению матрицы (строки матрицы)
// можно сделать запросом select distinct id from table order by id
foreach($rows as $row)
$id_dem[$row['id']] = 1;
// получаем все значения по date - измерению матрицы (столбцы матрицы)
// можно сделать запросом select distinct date from table order by date
foreach($rows as $row)
$date_dem[$row['date']] = 1;
$map = null; // если нет значений размерности матрицы, то функция вернет null
// получаем карту не-null значений - непустые ячейки матрицы
foreach($rows as $row)
$map[$row['id']][$row['date']] = $row['count'];
// дополняем карту null значениями - получаем полноценную матрицу
if(isset($id_dem) && isset($date_dem))
foreach($id_dem as $id => $val_id)
foreach($date_dem as $date => $val_date)
$map[$id][$date] = array_key_exists($id, $map) && array_key_exists($date, $map[$id])
? $map[$id][$date] : null;
return $map;
}
select u.user_id, w.wallet_id, wa.value as address
from users u
join wallet_address wa on wa.user_id = u.user_id
join wallets w on w.wallet_id = wa.wallet_id
where wa.value is not null
<style>
#div1
{
display: block;
width: 400px;
height: 1400px;
background-color: green;
}
#div2
{
display: block;
width: 400px;
height: 400px;
background-color: red;
}
</style>
<div id="div1">
</div>
<div id="div2">
</div>
<script>
//Функция для определения необходимости выполнения действия,
//связанное с появлением элемента elem_id в видимой части документа
function SomethingToDoElem(e, elem_id)
{
var elem = document.getElementById(elem_id);
if(elem === null)
return;
//определение размера видимой части документа без JQuery
var opera = (navigator.userAgent.toLowerCase().indexOf('opera') > -1),
html = document.documentElement,
body = document.body,
w = document.compatMode=='CSS1Compat' && !opera ? html.clientWidth : body.clientWidth,
h = document.compatMode=='CSS1Compat' && !opera ? html.clientHeight : body.clientHeight;
// если величина прокрутки по вертикали + видимая высота документа
//превышает расстояние от верха документа до элемента,
// для которого требуется действие доскроллинга, то выполняем это действие
if(e.currentTarget.scrollY + h > elem.offsetTop)
{
var is_did_something = elem.getAttribute('is_did_something'); // если действие однократного применения,
//то получаем данные о том, что оно не выполнялось ранее, например, с помощью атрибута тега.
if(is_did_something === null) // атрибут не создан, значит действия не было
{
setTimeout(function(){elem.style.backgroundColor = 'blue'; }, 1000); // выполняем действие
elem.setAttribute('is_did_something', 1); // записываем, что действие выполнили
// для проверки однократности его выполнения
}
}
}
// Ловим события, для которых возможно понадобиться действие доскроллинга
// на загрузку документа, лучше использовать JQuery аналог
window.onload = function(e)
{
SomethingToDoElem(e, "div2");
}
// на прокрутку документа
window.onscroll = function(e)
{
SomethingToDoElem(e, "div2");
}
// на изменение размера окна документа, если дизайн резиновый
// и интересуемый элемент div2 может изменять в этом случае свое положение
// при ресайзе окна браузера.
// !!!: лучше не привязывать через $().on('resize', ...) криво срабатывает вызов,
// использовать только нативные способы подписки на событие.
window.onresize = function(e)
{
SomethingToDoElem(e, "div2");
}
// Также нужно вызывать SomethingToDoElem(e, "div2"); при любом динамическом изменении
// контента страницы или блока, где этот контент расположен.
</script>
Там выводятся записи за последние 24 часа.
И надпись убирается через 24 часа если изменений нет.
select count(*) as cnt
from (select user_id
from table
group by user_id)
$query = 'INSERT INTO `users`(`email`, `password`) VALUES ('.$login.', '.$password.')';
<?php
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'world');
/* check connection */
if (!$link) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent);
$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;
/* execute prepared statement */
mysqi_stmt_execute($stmt);
printf("%d Row inserted.\n", mysqli_stmt_affected_rows($stmt));
/* close statement and connection */
mysqli_stmt_close($stmt);
/* Clean up table CountryLanguage */
mysqli_query($link, "DELETE FROM CountryLanguage WHERE Language='Bavarian'");
printf("%d Row deleted.\n", mysqli_affected_rows($link));
/* close connection */
mysqli_close($link);
?>