PDA

Показать полную графическую версию : запрос к базе данных


Страниц : [1] 2

binders
12-09-2011, 02:35
как мне сделать запрос к базе данных ?

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


$san_top10[8]=10 ;

$sql = $db->query("SELECT * FROM " . PREFIX . "_post WHERE approve='1' AND category IN($san_top10[8]) AND id NOT IN ($san_top10[9]) $datag $imgs ORDER BY $san_top10[10] LIMIT 0,$san_top10[4]");

если в базе поле категории == 10,34,56 то продукты из 10 не выводит

Зыы.. подозреваю что это просто но не могу правильный запрос к гууглу задать

Sham
12-09-2011, 09:53
слабо понятно, что нужно.

вероятно перед этим запросом нужно найти ид, которые во многих категориях, чтобы их исключить...если в базе поле категории == 10,34,56 »
т.е. если поле содержит список через запятую, то FIND_IN_SET (http://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_find-in-set) для поиска значения в этих полях...

RostVY
12-09-2011, 12:20
примеры таблиц(ы) в студию!

binders
12-09-2011, 17:06
есть модуль вывода 10 последних продуктов

если продукт в нескольких категориях то его не выводит не в одной

в каких категориях продукт если он во многих категориях их эти категории записывает в базу через запятую

надо чтоб в каждой категории показывался этот продукт если даже он прописан в нескольких и чтоб в каждой категории были продукты только из своей категории



вот модуль целиком



if(!defined('DATALIFEENGINE'))
{
die("Hacking attempt!");
}
require_once(ENGINE_DIR.'/data/config.top10.php');
$san_top10=unserialize($san_dbt);
$top10news = dle_cache("top10news", $config['skin']);

$shab = '#http:.{20,100}(\.jpg|\.jpeg|\.gif|\.png)#i';

$now = date ('Y-m-d H:i:s', $_TIME);
$imgs="";
if (isset($san_top10[6]))
$imgs=" AND (short_story LIKE '%src=%' OR xfields LIKE '%src=%' OR full_story LIKE '%src=%')";
$datag=" AND date >= '$now' - INTERVAL ".$san_top10[3]." DAY AND date < '$now'";
if ($san_top10[3]==0) $datag="";

//Раскомментируй текст ниже (удали /* и */) если хочешь чтоб модуль вибирал новости только из категории, в которой находится юзер.

/*
$notcat='2|33'; //В каких категориях выводить новость как на главной, разделять обязательно знаком | !!!
if ($category_id AND !preg_match('/('.$notcat.')/', $category_id)) {
$san_top10[8]=$category_id;
// $san_top10[10]='(news_read+comm_num) DESC'; //В этой строчке меняется тип сортировки на (просмотры+комментарии). По желанию, эту строчку можно удалить (закомментировать) или отредактировать если знаешь что пишешь.
}
// echo"$category_id";
*/
if (!isset($san_top10[0]))
$sql = $db->query("SELECT * FROM " . PREFIX . "_post WHERE approve='1' AND category IN($san_top10[8]) AND id NOT IN ($san_top10[9]) $datag $imgs ORDER BY $san_top10[10] LIMIT 0,$san_top10[4]");
else
$sql = $db->query("SELECT * FROM " . PREFIX . "_post WHERE approve='1' AND id NOT IN ($san_top10[9]) $imgs ORDER BY date ASC LIMIT 0,$san_top10[4]");

while ($row = $db->get_row($sql)) {

$row['category'] = intval ($row['category']);
$row['date'] = strtotime($row['date']);
if ($config['allow_alt_url'] == "yes") {
if ($row['flag'] AND $config['seo_type']) {
if ($row['category'] AND $config['seo_type'] == 2) {
$full_link = $config['http_home_url'].get_url($row['category'])."/".$row['id']."-".$row['alt_name'].".html";
} else {
$full_link = $config['http_home_url'].$row['id']."-".$row['alt_name'].".html";
}
} else {
$full_link = $config['http_home_url'].date('Y/m/d/', $row['date']).$row['alt_name'].".html";
}
} else {
$full_link = $config['http_home_url']."index.php?newsid=".$row['id'];
}

$xfieldsdata = xfieldsdataload( $row['xfields'] );
$image=$xfieldsdata['poster'];
if ($image=='')
{

preg_match($shab, $row['short_story'], $image);
$image=$image[0];
}
if ($image=='')
{
preg_match($shab, $row['xfields'], $image);
$image=$image[0];
}
if ($image=='')
{
preg_match($shab, $row['full_story'], $image);
$image=$image[0];
}
if ($image=='') $image="{THEME}/images/".$san_top10[7];
if ($row['rating']==0) $row['rating']=1;
if ($row['vote_num']=='0') $row['vote_num']=1;
$row['title']=preg_replace("/'/","`",$row['title']);
$row['title']=preg_replace('/"/',"&quot",$row['title']);
$rate='Рейтинг: <b>'.round($row['rating']/($row['vote_num']),2).'</b>';
$read='Просмотрело: <b>'.$row['news_read'].'</b> чел.';

if (!$row['category']) { $my_cat = "---"; $my_cat_link = "---";} else {
$my_cat = array (); $my_cat_link = array ();
$cat_list = explode (',', $row['category']);
if (count($cat_list) == 1) {
$my_cat[] = $cat_info[$cat_list[0]]['name'];
$my_cat_link = get_categories ($cat_list[0]);
} else {

foreach ($cat_list as $element) {
if ($element) { $my_cat[] = $cat_info[$element]['name']; if ($config['ajax']) $go_page = "onclick=\"DlePage('do=cat&category={$cat_info[$element]['alt_name']}'); return false;\" "; else $go_page = "";
if ($config['allow_alt_url'] == "yes")
$my_cat_link[] = "<a {$go_page}href=\"".$config['http_home_url'].get_url($element)."/\">{$cat_info[$element]['name']}</a>";
else
$my_cat_link[] = "<a {$go_page}href=\"$PHP_SELF?do=cat&category={$cat_info[$element]['alt_name']}\">{$cat_info[$element]['name']}</a>";
}
}
$my_cat_link = implode (', ', $my_cat_link);
}
$my_cat = implode (', ', $my_cat);
}
$elt++;
$nline="";
if ($elt>=$san_top10[5]) {$nline="<br>"; $elt=0;}

create_cache("top10news", $top10news);
$tpl->load_template('top10_blog.tpl');
$tpl->set('{category}', $my_cat);
$tpl->set('{title_cut}', substr($row['title'],0,$san_top10[1]));
$tpl->set('{title}', substr($row['title'],0,$san_top10[2]));
$tpl->set('{href}', $full_link);
$tpl->set('{image}', $image);
$tpl->set('{rate}', $rate);
$tpl->set('{news_read}', $read);
$tpl->set('{descr}', $row['descr']);
$tpl->set('{newline}', $nline);
$tpl->compile('top10news');
$tpl->clear();
}
$db->free();

Sham
12-09-2011, 18:04
все равно мутно как-то

...AND `category` = '10' // элементы только одной категории 10
...AND FIND_IN_SET(10, `category`) // все элементы с категорией 10, включая с одной.

binders
12-09-2011, 19:51
не получилось
...AND FIND_IN_SET(10, `category`) // все элементы с категорией 10, включая с одной. »

попробую объяснить по другому

есть фильм он относится к нескольким категориям ( триллер, драма, военный, биография )
триллер == категория = 1
драма == категория = 2
военный == категория = 3
биография == категория = 4

при добавлении его в базу в графе категория прописывается следующее ( 1,2,3,4 )

при работе модуля что выше должно выводить 10 последних добавленных фильмов

в переменную $san_top10[8] выводится для какой категории выводить последнюю 10


но фильм добавленный сразу в несколько категорий показывается только в первой 1, а в остальных его нет
надо чтоб показывал в каждой отдельной категории

вот пример как надо не работающего модуля cinem.ru ( ссылку можно \ нужно удолить )

Sham
12-09-2011, 21:31
SELECT `id` FROM `post` WHERE FIND_IN_SET(3, `category`)
должен вывести иды для 3 категории, где категория в виде "1,2,3,4" и "3"

проверьте простым запросом в админ-панели где-нибудь...

binders
12-09-2011, 22:54
всё работает спасибо это я криворукий не в тот запрос вписал

но когда я прописываю из каких категориях выводить выдаёт ошибку

FIND_IN_SET(14,13,2,3,4,5,6,7,8,9,10,11,12,16, `category`)

Sham
13-09-2011, 08:03
rtm там только два параметра допустимы. Если категорий несколько, то на каждую свой FIND_IN_SET. Строку в скрипте можно сформировать.
....
AND (
FIND_IN_SET(14,`category`) OR
FIND_IN_SET(13,`category`) OR
FIND_IN_SET(2,`category`)
) AND
.....
красивее способа не знаю.

binders
16-09-2011, 02:54
а как составить запрос чтоб в цикле выводило только определённые записи из базы данных ?

пример
мне надо чтоб вывело только id=678 \ id=876 \ id=987

Sham
16-09-2011, 07:38
... AND `id` IN (678,876,987) ...

binders
12-10-2011, 06:03
возникли вопросы

1== как сделать переброс из одной базы данных в другую не подряд как это делается обычно а в разнобой ( пример = Обычный вариант Ид=1 ,Ид=2 ,Ид=3 ,Ид=4 ,Ид=5 ,Ид=6 надо чтоб шло както так Ид=6789 ,Ид=877 ,Ид=987655 ,Ид=789 ,Ид=357 ,Ид=1 ,Ид=765 , )

2== как сделать разброс даты в пределах скажем 2 месяцев дата в базу прописывается date("Y-m-d H:i:s")

Sham
12-10-2011, 07:53
1. непонятно. Пишите скрипт и переносите как угодно.
2. BETWEEN (http://dev.mysql.com/doc/refman/5.6/en/comparison-operators.html#operator_between) (с датами работает).

binders
12-10-2011, 17:23
при переносе из одной таблицы в друную надо чтоб не подряд выборка шла а в разнобой

Sham
12-10-2011, 18:22
вроде ORDER BY RAND() - но имхо непроизводительно.

binders
12-10-2011, 18:44
ORDER BY RAND() в полне подойдёт
а вот насчет даты там вроде не то надо чтоб тоже произвольна ( в разнобой ) в пределах определённого промежутка добавлять дату ане выборку делать

Sham
12-10-2011, 20:19
попробуйте это выражение
`date_min` поле с минимальной датой (в виде 2011-10-11 00:00:00)
`date_max` поле с максимальной датой

FROM_UNIXTIME(
FLOOR(
UNIX_TIMESTAMP(`date_min`) + RAND() * (
UNIX_TIMESTAMP(`date_max`) – UNIX_TIMESTAMP(`date_min`)
)
)
)

результат должен быть в виде случайной даты между указанными.

binders
12-10-2011, 20:50
а как ету случайную дату в переменную засунуть ?

ато я сделал так

if (mysql_query("INSERT INTO `".PREFIX."_post` set
title='".$row['title']."' ,
short_story='".$row['short_story']."',
full_story='".$row['full_story']."',
approve='0',
autor='$dle_user2',
date='FROM_UNIXTIME(
FLOOR(
UNIX_TIMESTAMP(`$date_min`) + RAND() * (
UNIX_TIMESTAMP(`$date_max`) – UNIX_TIMESTAMP(`$date_min`)
)
)
)'
"))
{


но не работает

Sham
12-10-2011, 21:00
не, без кавычек, это ж функция FROM_UNIXTIME. А вот там где строка (переменная) - там одинарные кавычки. Косые только в имени поля таблицы.

Если в PHP формируется строка запроса, то лучше конечно дату полностью в PHP сделать...

binders
13-10-2011, 00:20
чегото до меня не дошло что и куда прописывать
можно показать ?




© OSzone.net 2001-2012