$need_count = 10; // сколько требуется файлов для выборки
$alive_count = 0; // сколько живых файлов
$is_need_repeat = true; // требуется повторить попытку получить живые файлы
$death_list = []; // сюда накапливаем список id мертвых файлов
$alive_list = []; // сюда накапливаем список id живых файлов
while($is_need_repeat) // Если можно делать итерационную попытку и пока не набрали нужное количество живых файлов
{
// Этот запрос, чтобы прощупать целостность файлов, достаточно получить только те атрибуты, которые позволяют проверить его путь и запомнить id.
$database->setQuery("
SELECT id
from блаблабла
WHERE блаблабла
".(count($depth_list) > 0 ? : ' and id not in ('.join(',',$death_list).') ' : '')." -- отсеиваем мертвые файлы из запроса, они нам не нужны
".(count($alive_list) > 0 ? : ' and id not in ('.join(',',$alive_list).') ' : '')." -- отсеиваем живые файлы из запроса, мы их уже проверяли
ORDER блаблабла
limit 0,".($need_count - $alive_count)); // делаем лимит по оптимистичному сценарию, как будто можем получить список файлов, и все они будут живые, но только то кол-во, которое недостает
while($row = mysql_fetch_assoc($request))
{
if(file_exists('/www/ПУТЬ/'.$row['id'].'_100.jpg'))
{
$alive_list[] = $row['id']; // файл живой, заносим его id в список
}
else
{
$death_list[] = $row['id']; // файл мертвый, заносим его id в список
}
$curr_alive_count = count($alive_list);
$is_need_repeat = $curr_alive_count > 0 && $curr_alive_count > $alive_count && $curr_alive_count < $need_count; // необходимо продолжить попытки, если на текущей итерации получили хоть один живой файл, живых файлов на этой итерации оказалось больше, чем на предыдущей, и их кол-во не достаточно до необходимого
$alive_count = $curr_alive_count; // вписываем кол-во живых файлов на текущей итерации для проверки в будущем цикле (чтобы сравнить результаты двух циклов)
}
}
// теперь можно сделать нормальный запрос, исключив мертвые файлы:
$database->setQuery("
SELECT *
from блаблабла
WHERE блаблабла
".(count($depth_list) > 0 ? : ' and id not in ('.join(',',$death_list).') ' : '')." -- отсеиваем мертвые файлы из запроса
ORDER блаблабла
limit 0,".$need_count);
$database->setQuery("
SELECT *
from блаблабла
WHERE блаблабла
and is_del is null -- или нулю, в зависимости, что будет по умолчанию
ORDER блаблабла
limit 0,".$need_count);
т.е. если в таблице wp_reviews запись с company_id=2001 не существует, то для таблицы wp_posts для строки с ID=2001 обновляем post_status на 'draft'
update wp_posts p
set p.post_status = 'draft'
where not exists (select 1 from wp_reviews r where r.связующий_ключ = p.связующий_ключ)
$limit = 'limit 0, 500';
$order_column = 'added';
$order_direct = 'desc';
if(isset($_GET['order_col']))
{
if($_GET['order_col'] == 'updated')
$order_column = 'updated'; // не вздумайте подставлять из GET название колонки, будет sql-инъекция!
}
if(isset($_GET['order_dir']))
{
if($_GET['order_dir'] == 'asc')
$order_direct = 'asc'; // не вздумайте подставлять из GET название клаузы, будет sql-инъекция!
}
if (isset($_GET['ajax2'])) $limit = 'limit '.(int)$_GET['offset'].', 30'; // тут застраховано от инъекции при помощи преобразования в int!
$rows = fs::getObjects($sql, "order by c_object.".$order_column." ".$order_direct." ".$limit);
$rowsCount = count(fs::getObjects($sql));
if (isset($_GET['ajax2']) && !count($rows))
{
header("HTTP/1.0 404 Not Found");
die;
}
SELECT
city.id,
city.name,
country.name,
salary,
country.is_here
FROM city
LEFT JOIN country ON city.cid = country.id
union all
SELECT
city.id,
city.name,
country.name,
salary + 2000,
1
FROM city
LEFT JOIN country ON city.cid = country.id
where (country.id is null or country.is_here = 0)
SELECT t1.ProductCode, t2.Name
FROM table_one as t1 -- t1 - краткий псевдоним таблицы table_one в пределах select-а
LEFT OUTER JOIN table_two as t2 -- t2 - краткий псевдоним таблицы table_two в пределах select-а
ON t2.id = t1.id_client;
Есть роль А И B. Только роль A может начать чат с ролью B
Чат может содержать только 2х лиц
Например в db1 есть table_user с сотнями данных, а в db2 его нет. Нужно, чтобы table_user перешел в db2, но без данных, нужно чтобы она просто создалась.
И второй вариант событий: в db1 и db2 есть table_user, но у db1 table_user появилось 20 новых колонок, как их передать в более легком виде db2 table_user?
select * from
(select r.id as reader_id, r.first_name, r.last_name, b.id book_id, b.name, b.pub_date, row_number() over (partition by r.id order by l.taken_at desc) as rownum
from readers r
left join log_taking l on r.id = l.reader_id
left join books b on b.id = l.book_id
) a
where a.rownum = 1
INSERT into archive (title_product, title_category, price_product)
SELECT p.title, c.title, p.price
from product p
join category c on p.category_id = c.id
-- MySQL
select u.user_id, child_bdays.bday
from user u,
JSON_TABLE(u.children, '$[*]' COLUMNS (
bday VARCHAR(10) PATH '$'
)) child_bdays
where STR_TO_DATE(child_bdays.bday, "%Y-%m-%d") >= DATE(now() - INTERVAL 7 DAY)
and STR_TO_DATE(child_bdays.bday, "%Y-%m-%d") <= DATE(now() + INTERVAL 7 DAY);
-- MariaDB
select u.user_id, JSON_EXTRACT(u.children, concat('$[', idx_table.idx, ']')) as bday
from user u,
(select 0 idx union select 1 union select 2 union
select 3 union select 4 union select 5 union
select 6 union select 7 union select 8 union
select 9 union select 10 union select 11) idx_table /* впомогательная выборка для генерации индексов в диапазоне 0...11 */
where idx_table.idx < json_length(u.children) /* отсекаем обращения к несуществующим индексам элементов в JSON*/
and STR_TO_DATE(JSON_EXTRACT(u.children, concat('$[', idx_table.idx, ']')), "%Y-%m-%d") >= DATE(now() - INTERVAL 7 DAY)
and STR_TO_DATE(JSON_EXTRACT(u.children, concat('$[', idx_table.idx, ']')), "%Y-%m-%d") <= DATE(now() + INTERVAL 7 DAY)
Select distinct table_schema, table_name
from information_schema.colums
where column_name = 'имя поля'
SELECT table_name, column_name, data_type, data_length
FROM USER_TAB_COLUMNS
WHERE column_name = 'имя поля'
update table tb
set tb.type_id = (select tp.id from types tp where tp.name = tb.type_name limit 1) -- выбираем подзапросом id из справочника по совпадению наименования поля в обновляемой таблице
where tb.type_id is null -- страховка, что будем обновлять не установленные значения
and exists(select 1 from types tp where tp.name = tb.type_name) -- будем ставить ключ, если есть наименование в справочнике types
with factor as (select level as lvl from dual connect by level < 10)
select to_char(f1.lvl) || 'x' || to_char(f2.lvl) || '=' || to_char(f1.lvl * f2.lvl) as multi
from factor f1,
factor f2
select *
from (
select t.*, dbms_random.value(0, 100) rnd
from table t
) A
where A.rnd <= 30 -- выбираем примерно 30% случайных записей от ген. выборки