Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.24;
Скачать: CL | DM;

Вниз

Как можно составить запрос?   Найти похожие ветки 

 
No_Dead ©   (2008-06-20 13:00) [0]

Есть таблица
CREATE TABLE `Pages` (
 `NamePage` varchar(50) NOT NULL default "",
 `LeftAd` char(1) NOT NULL default "",
 `CenterAd` char(1) NOT NULL default "",
 `RigthAd` char(1) NOT NULL default "",
 `Help` enum("YL","YC","YR","N") default "N",
 `viewUser` enum("YL","YC","YR","N") default "N",
 `Opros` enum("YL","YC","YR","N") default "N",
 `News` enum("YL","YC","YR","N") default "N",
 `Menu` enum("YL","YC","YR","N") default "N",
 `Guest` enum("YL","YC","YR","N") default "N",
 UNIQUE KEY `NamePage` (`NamePage`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;


и такой строкой
INSERT INTO `Pages` VALUES ("/index.php", "1", "1", "1", "N", "YL", "YL", "YL", "N", "N");
Можно ли составить запрос что бы выбрались все значения с YL? Как тогда?

Или (имхо) структура составлена не верно?


 
Simpson ©   (2008-06-20 13:01) [1]

База какая?


 
No_Dead ©   (2008-06-20 13:02) [2]

> [1] Simpson ©   (20.06.08 13:01)

упс)) MySQL


 
Simpson ©   (2008-06-20 13:03) [3]

`NamePage` varchar(50) NOT NULL default "",

UNIQUE KEY `NamePage` (`NamePage`)

Вот это как между собой стыкуется? У тебя второй запрос по умолчанию не пройдет.


 
No_Dead ©   (2008-06-20 13:06) [4]

> [3] Simpson ©   (20.06.08 13:03)

ну, NamePage д.б. не пустым и уникальным. или я неправильно понимаю?


 
Simpson ©   (2008-06-20 13:06) [5]

IMHO
Если таблица одно то и фиг бы с ней, если несколько как ты их связывать будеш?
Первичный ключ добавь.
А разве запрос
select * from Pages where Help = "YL" не проходит?


 
Simpson ©   (2008-06-20 13:08) [6]

No_Dead ©   (20.06.08 13:06) [4]
пустое значение по твоему условию возможно только одно, поле то уникальное. У тебя движок БД должен ругнуться.


 
No_Dead ©   (2008-06-20 13:10) [7]

> [5] Simpson ©   (20.06.08 13:06)

проходит. выбираются все записи с "YL".

мне б вот что-то типо этого
SElect * from pages where pages.NamePage=«/index.php» and pages.*="YL"


 
No_Dead ©   (2008-06-20 13:12) [8]

> [6] Simpson ©   (20.06.08 13:08)

бд, в частности таблица создавалась в phpMyAdmin. ругательств не было


 
Sergey13 ©   (2008-06-20 13:12) [9]

> [0] No_Dead ©   (20.06.08 13:00)
> Можно ли составить запрос что бы выбрались все значения с YL?

select * from Pages where Help = "YL" or viewUser = "YL" or ...

не то?

> Или (имхо) структура составлена не верно?

ИМХО, что бы судить об этом надо знать предметную область задачи для этой таблицы.


 
No_Dead ©   (2008-06-20 13:16) [10]

> [9] Sergey13 ©   (20.06.08 13:12)


эта таблица для  того, что бы пользователь мог выбрать блоки которые он хочет видить на странице сайта, а какие нет.
К примеру, он может через свой профиль изменить расположение блоков для себя: «News» по умолчанию будет справа, а пользователь может разместить либо слева, либо по центру, либо вообще что бы не отображались.
ну, по крайней мере так в общих чертах мне описали задачу%>


 
Simpson ©   (2008-06-20 13:18) [11]

No_Dead ©   (20.06.08 13:10) [7]
ты должен четко указать взапросе что с чем ты сравниваеш. БД не умеет за тебя определять какие поля будут участвовать в запросе.
например:
Sergey13 ©   (20.06.08 13:12) [9]
select * from Pages where Help = "YL" or viewUser = "YL" or ...

No_Dead ©   (20.06.08 13:12) [8]
Синтаксически таблица составлена правильно, но у тебя ограничение на уникальность поля `NamePage` второе пустое значение ты туда не вставиш, ошибка не синтаксическая, а логическая.


 
clickmaker ©   (2008-06-20 13:20) [12]

> мне б вот что-то типо этого
> SElect * from pages where pages.NamePage=«/index.php» and
> pages.*="YL"

тут, вроде, напрашивается наоборот: поля YL, YC, ..., а в них - набор Help, viewUser. Ну что-то наподобие битовых флагов


 
Sergey13 ©   (2008-06-20 13:21) [13]

> [10] No_Dead ©   (20.06.08 13:16)

Тогда структура не верна.
Нужна дочерняя табличка, в которой будут храниться связки блоки-видимость.


 
No_Dead ©   (2008-06-20 13:24) [14]

> ты должен четко указать взапросе что с чем ты сравниваеш.
> БД не умеет за тебя определять какие поля будут участвовать
> в запросе.

тогда это будет select * from Pages where NamePage = "/index.php", а потом уже ворожить в скрипте%)


> ограничение на уникальность поля `NamePage` второе пустое
> значение ты туда не вставиш


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


 
No_Dead ©   (2008-06-20 13:28) [15]

> [12] clickmaker ©   (20.06.08 13:20)

хм. а как если YL может соответствовать двум и более блокам?


> [13] Sergey13 ©   (20.06.08 13:21)
> Тогда структура не верна.

вот и мне тоже так показалось. но думаю, спрашу, подстрахуюсь)
щас помозгую над «дочей»


 
Simpson ©   (2008-06-20 13:35) [16]

No_Dead ©   (20.06.08 13:24) [14]
тогда это будет select * from Pages where NamePage = "/index.php", а потом уже ворожить в скрипте%)

Это хорошо если у тебя 10 строк, а если 100 000?
Скрипт не погибнет от использования недозволенной магии?


 
Simpson ©   (2008-06-20 13:51) [17]

Оперции со строками проходят на порядок дольше чем с целыми. У тебя строковое значение вместо ключа ты бы проиндексировал его что ли, или зделал ключ целым.

CREATE TABLE `Pages` (
id integer not null auto_increment,
`NamePage` varchar(50) NOT NULL default "",
`LeftAd` char(1) NOT NULL default "",
`CenterAd` char(1) NOT NULL default "",
`RigthAd` char(1) NOT NULL default "",
`Help` enum("YL","YC","YR","N") default "N",
`viewUser` enum("YL","YC","YR","N") default "N",
`Opros` enum("YL","YC","YR","N") default "N",
`News` enum("YL","YC","YR","N") default "N",
`Menu` enum("YL","YC","YR","N") default "N",
`Guest` enum("YL","YC","YR","N") default "N",
primary key(id),
UNIQUE KEY `NamePage` (`NamePage`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;


 
Simpson ©   (2008-06-20 13:57) [18]

Ты лучше еще раз над структурой подумай, с тем что ты написал ты получиш кучу проблем, жуткие тормоза и вылеты скрипта


 
No_Dead ©   (2008-06-20 14:01) [19]

> Simpson ©

ну вот скриптик такой:
include_once(«config.php»);
$query=«SELECT * FROM pages WHERE NamePage="/index.php"»;
$r = mysql_query($query) or die(mysql_error());
$b=(mysql_fetch_array($r));
foreach ($b as $k=>$v){
if ($v="YL" and GETTYPE($k)!=«integer»)
echo $k.&laquo;++++++++++&raquo;.$v.&laquo;<br></br>&raquo;;
}


медленно будет?


 
No_Dead ©   (2008-06-20 14:10) [20]

> No_Dead ©   (20.06.08 14:01)

не то%)


 
No_Dead ©   (2008-06-20 14:15) [21]

[19] то, что надо. (там в условии надо ==, а не =, необедавши глупые ошибки делаю)
вот скорость интересует.


 
Simpson ©   (2008-06-20 15:23) [22]

конечно медленно, 100 000 записей передать с сервака(БД) потом каждую проверить.
Ты лучше напиши условие. Вообще есть книга для начинающих по бд автор Грубер посмотри в инете. Обьем страниц 200 максимум.

include_once(«config.php»);
$query=«select * from Pages where Help = "YL" or viewUser = "YL" or ... or `Guest` = "YL"»;
// вместо ... перечисли поля
$r = mysql_query($query) or die(mysql_error());
$b=(mysql_fetch_array($r));
foreach ($b as $k=>$v){
if ($v == "YL" and GETTYPE($k)!=«integer»)
echo $k.«++++++++++».$v.«<br></br>»;
}


 
No_Dead ©   (2008-07-15 22:08) [23]

итак. во что было сделано
подредактировал таблицу pages до вида
CREATE TABLE `Pages` (
 `n_page` smallint(6) NOT NULL auto_increment,
 `NamePage` varchar(50) NOT NULL default "",
 `LeftAd` char(1) NOT NULL default "",
 `CenterAd` char(1) NOT NULL default "",
 `RigthAd` char(1) NOT NULL default "",
 PRIMARY KEY  (`n_page`),
 UNIQUE KEY `NamePage` (`NamePage`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=19 ;


создал еще две таблицы
CREATE TABLE `manager` (
 `id_punkt` smallint(6) NOT NULL auto_increment,
 `name_punkt` varchar(20) NOT NULL default "",
 `punkt_put` varchar(30) NOT NULL default "",
 PRIMARY KEY  (`id_punkt`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=8 ;

в которой
`name_punkt` &#151; имя которое бдет отображаться в заголовке блока
`punkt_put` &#151; путь откуда нужно будет инклудить файл

и

CREATE TABLE `content` (
 `id_cont` smallint(5) unsigned NOT NULL auto_increment,
 `id_pages` smallint(5) unsigned default NULL,
 `id_punkt` smallint(5) unsigned default NULL,
 `position` enum("L","R","C") default NULL,
 `show` enum("Y","N") default NULL,
 UNIQUE KEY `id_cont` (`id_cont`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=18 ;


где `id_pages` &#151; номер страницы (т.е. Pages.n_page=content.id_pages)
`id_punkt` &#151; номер блока (т.е. manager.id_punkt=content.id_punkt)
`position` &#151; расположение на странице (слево, справо, по центру)
`show` &#151; отображать или нет

затем результат запроса помещаю в массив
$querycontent=&laquo;SElECT manager.punkt_put, manager.name_punkt FROM content,pages,manager where pages.NamePage="&raquo;.$_SERVER["PHP_SELF"].&laquo;" and pages.n_page=content.id_pages and content.position="L" and content.id_punkt=manager.id_punkt and content.show="Y"&raquo;;
$q_content=mysql_query($querycontent) or die(mysql_error());
while ($rower=mysql_fetch_array($q_content)) {
$leftcontent[$rower["name_punkt"]]=$rower["punkt_put"];
}


создал класс для вывода(где $rus_name название блока т.е. manager.name_punkt; и $loads путь к файлу, т.е. manager.punkt_put)

class manager_content{
FUNCTION load_content($rus_name,$loads){
echo &laquo;<TR>\n<TD vAlign=\&raquo;top\&laquo;>.$rus_name.</TD></TR>
<TR><TD vAlign=\&raquo;top\&laquo; class=\&raquo;tn\&laquo;>&raquo;;include($loads);
echo &laquo;</td></tr>&raquo;;
echo &laquo;<TR><TD ><IMG height=\&raquo;4\&laquo; src=\&raquo;image/spacer.gif\&laquo; width=\&raquo;100%\&laquo;></TD></TR>&raquo;;
}
}


и соответственно вывод уже на страницу
foreach($leftcontent as $k=>$v){
$content->load_content($k,$v);
}


вопрос: не будет ли сие тормозить?


 
No_Dead ©   (2008-07-15 22:17) [24]

немного изменил.
вместо трех запросов(делал для каждой позиции, т.е. для расположения [лево, право, центр]) сделал один
$querycontent=&laquo;SElECT manager.punkt_put,manager.name_punkt, content.position FROM content,pages,manager where pages.NamePage="&raquo;.$_SERVER["PHP_SELF"].&laquo;" and pages.n_page=content.id_pages and content.id_punkt=manager.id_punkt and content.show="Y"&raquo;;
$q_content=mysql_query($querycontent) or die(mysql_error());
while ($rower=mysql_fetch_array($q_content)) {
SWITCH ($rower["position"]){
case "R":
$rigthcontent[$rower["name_punkt"]]=$rower["punkt_put"];
break;
case "C":
$centercontent[$rower["name_punkt"]]=$rower["punkt_put"];
break;
case "L":
$leftcontent[$rower["name_punkt"]]=$rower["punkt_put"];
break;
}}


 
Игорь Шевченко ©   (2008-07-15 22:19) [25]


> Оперции со строками проходят на порядок дольше чем с целыми


Это только MySQL таким страдает ?


 
No_Dead ©   (2008-07-17 10:34) [26]

Удалено модератором
Примечание: Создание пустых сообщений


 
Johnmen ©   (2008-07-17 11:11) [27]


> No_Dead ©

Ты сайтом не ошибся? Здесь про Delphi.


 
No_Dead ©   (2008-07-17 11:15) [28]

> [27] Johnmen ©   (17.07.08 11:11)

:)) так я задавал вопрос в &laquo;прочем&raquo;, а его перенесли в &laquo;начинающие&raquo;)


 
brother ©   (2008-07-17 11:16) [29]

>
> :)) так я задавал вопрос в «прочем», а его перенесли в «начинающие»)

а почему не в базы?)))



Страницы: 1 вся ветка

Текущий архив: 2008.08.24;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.019 c
15-1215118235
@!!ex
2008-07-04 00:50
2008.08.24
Узнать алгоритм шифрования.


15-1214913162
abhtr
2008-07-01 15:52
2008.08.24
Странности с набором кода


15-1215509948
Yanis
2008-07-08 13:39
2008.08.24
Что за кодировка?


6-1191913609
Motzart_Motzart
2007-10-09 11:06
2008.08.24
Модем


3-1204293385
Yurka
2008-02-29 16:56
2008.08.24
Суммирование полей с выбором