powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как организовать бд для вот такой задачи?
25 сообщений из 109, страница 3 из 5
Как организовать бд для вот такой задачи?
    #38698166
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007 http://sqlfiddle.com/#!2/b25879/1
Ого, мне с моими зачаточными знаниями синтаксиса надолго хватит разбираться)
Хух, начали…
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38698168
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что это вообще за сайт, и почему там два окна?
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38698529
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejk,

слева создание схемы дынных и её наполнение
справа - собственно запрос(ы)

...там же на кнопках написано, неужели непонятно?
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38699922
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил пока вот так (на что хватило знаний), не смейтесь)
Но появилась проблемка…

Вот такие ошибки выдаёт:

Warning: array_merge() [function.array-merge]: Argument #2 is not an array in /home/… on line 51

Warning: implode() [function.implode]: Invalid arguments passed in /home/… on line 64

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
<?php
if ($_POST["vvod_slov"])
{
	$podkluchenie = mysql_connect("77777","777777","777777")  or die("MySQL сервер недоступен!".mysql_error());
	mysql_query("SET character_set_database=utf8"); 
	mysql_query("SET NAMES utf8");	
	mysql_select_db("webart_servis_kluchevyx_slov", $podkluchenie) or die("MySQL сервер недоступен!".mysql_error());

	$vvod_slov = $_POST["vvod_slov"]; //помещаем в переменную опорные слова строкой
	$oporn_slova = explode("\n", $vvod_slov);//разбиваем строку опорных слов на части и заносим их в массив(есть лишние пробелы)

	for ($i = 0; $i < count($oporn_slova); $i++)//перебираем массив из строки в новый массив (без лишних пробелов)
		{
		$oporn_slova_bez_probelov[$i] = trim($oporn_slova[$i]);
		}
	
	$osnova_stroki_zaprosa = implode("', '", $oporn_slova_bez_probelov);//делаем из массива опорных слов основу строки для sql запроса
	$stroka_zaprosa = "'" . $osnova_stroki_zaprosa . "'";//окончательно формируем строку для sql запроса
	
	$rezultat_podbora = mysql_query//подставляем строку для sql запроса в полный запрос
	("
	 SELECT `slova` FROM `tablizca_slov` WHERE `id` in
	(SELECT `id_slova` FROM `tablizca_svyazej` WHERE `id_izobrazheniya` in 
	(SELECT `id_izobrazheniya` FROM `tablizca_svyazej` WHERE `id_slova` in 
	(SELECT `id` FROM `tablizca_slov` WHERE `slova` IN (" . $stroka_zaprosa . "))))
	");

if ($rezultat_podbora)
{
	$n = 0;//номера ячеек $massiv_rezultata
	while ($data = mysql_fetch_array($rezultat_podbora))//выводим результат подбора списком с флажками
		{
		$massiv_rezultata[$n] = $data['slova'];//массив для вывода результата подбора строкой
		$n++;
		}
/НИЖЕ СТРОКА 51 #########################################################################
		$massiv_rezultata = array_merge($oporn_slova_bez_probelov, $massiv_rezultata);
	}
	else
	{
		$massiv_rezultata = $oporn_slova_bez_probelov;
		}

	for ($i = 0; $i < count($massiv_rezultata); $i++)
	{
		$a ++; //счётчик для имён флажков в результате подбора
		echo "<input type=\"checkbox\" name=\"checkbox_" . $a . "\" checked=\"checked\"> " . $massiv_rezultata[$i] . "<br>\n";
		}

//НИЖЕ СТРОКА 64 #########################################################################
	$rezultat = implode("; ", $massiv_rezultata);//создание строки из массива результата подбора 
	echo $rezultat;
		
	
	mysql_close($podkluchenie);
	echo "<hr class=\"otbivka_24\">";
}
?>



Думал с утра соображу — не получается.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38699933
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уточнение: так происходит, если пользователь вводит только слова, которых ещё нет в БД. Если среди введённых слов есть хоть одно и в БД, то отлично выполняется.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38699995
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkтак происходит, если пользователь вводит только слова, которых ещё нет в БД. Если среди введённых слов есть хоть одно и в БД, то отлично выполняетсяЕсли нет ни одного слова, то результатом запроса будет таблица с нулём записей. В этом случае этот цикл
Код: php
1.
while ($data = mysql_fetch_array($rezultat_podbora))

не выполняется ни разу, а массив "$massiv_rezultata" должен создаваться как раз там. Ну и дальше пошло-поехало.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38700044
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
" tanglir]andrejkтак происходит, если пользователь вводит только слова, которых ещё нет в БД. Если среди введённых слов есть хоть одно и в БД, то отлично выполняетсяЕсли нет ни одного слова, то результатом запроса будет таблица с нулём записей. В этом случае этот цикл
Код: php
1.
while ($data = mysql_fetch_array($rezultat_podbora))

не выполняется ни разу, а массив "$massiv_rezultata" должен создаваться как раз там. Ну и дальше пошло-поехало.[/quot]"

Огромное спасибо, решил так:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
$rezultat_podbora = mysql_query//подставляем строку для sql запроса в полный запрос
	("
	 SELECT `slova` FROM `tablizca_slov` WHERE `id` in
	(SELECT `id_slova` FROM `tablizca_svyazej` WHERE `id_izobrazheniya` in 
	(SELECT `id_izobrazheniya` FROM `tablizca_svyazej` WHERE `id_slova` in 
	(SELECT `id` FROM `tablizca_slov` WHERE `slova` IN (" . $stroka_zaprosa . "))))
	");
	
$n = 0;//номера ячеек $massiv_rezultata
	while ($data = mysql_fetch_array($rezultat_podbora))//если в $rezultat_podbora нет ни одной записи, то цикл не выполняется
		{
		$massiv_rezultata[$n] = $data['slova'];//массив для вывода результата подбора строкой
		$n++;
		}
		
if ($massiv_rezultata)
{
		$massiv_rezultata = array_merge($oporn_slova_bez_probelov, $massiv_rezultata);
		//$massiv_rezultata = array_unique($massiv_rezultata);
	}
	else
	{
		$massiv_rezultata = $oporn_slova_bez_probelov;
		}

	for ($i = 0; $i < count($massiv_rezultata); $i++)
	{
		$a ++; //счётчик для имён флажков в результате подбора
		echo "<input type=\"checkbox\" name=\"checkbox_" . $a . "\"> " . $massiv_rezultata[$i] . "<br>\n";//выводим результат подбора списком с флажками
		}

	$rezultat = implode("; ", $massiv_rezultata);//создание строки из массива результата подбора
	echo $rezultat;
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38700463
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007 http://sqlfiddle.com/#!2/b25879/1

Пробую у себя на сервере,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
[SRC PHP]create table tst_filekeys (
  fid int, 
  wid int, 
  primary key PK_tst_filekeys_FW(fid,wid),
  key IX_tst_filekeys_WF(wid,fid),
  constraint FK_tst_filekeys_F foreign key(fid) references tst_files(id),
  constraint FK_tst_filekeys_W foreign key(wid) references tst_keywords(id)
  );

[/SRC]

выдаёт ошибки:

#1005 - Can't create table 'webart_servis_kluchevyx_slov.tst_filekeys' (errno: 150

Percona-XtraDB, Supports transactions, row-level locking, and foreign keys
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38700531
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин, думал что запрос делает что надо, а он, гад, выбирает всё подряд)
Можно ли вот это

Код: sql
1.
2.
3.
4.
5.
6.
7.
$rezultat_podbora = mysql_query//подставляем строку для sql запроса в полный запрос
	("
	 SELECT `slova` FROM `tablizca_slov` WHERE `id` in
	(SELECT `id_slova` FROM `tablizca_svyazej` WHERE `id_izobrazheniya` in 
	(SELECT `id_izobrazheniya` FROM `tablizca_svyazej` WHERE `id_slova` in 
	(SELECT `id` FROM `tablizca_slov` WHERE `slova` IN (" . $stroka_zaprosa . "))))
	");



изменить так, чтобы
Код: sql
1.
SELECT `id_izobrazheniya` FROM `tablizca_svyazej` 

выбирал не все изображения, которым удовлетворяет хоть одно условие из
Код: sql
1.
2.
WHERE `id_slova` in 
	(SELECT `id` FROM `tablizca_slov` WHERE `slova` IN (" . $stroka_zaprosa . ")))

,
а те, которым удовлетворяют сразу все условия из
Код: sql
1.
2.
WHERE `id_slova` in 
	(SELECT `id` FROM `tablizca_slov` WHERE `slova` IN (" . $stroka_zaprosa . "))

?
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38700538
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkа те, которым удовлетворяют сразу все условиясм.мой вариант запроса (а может, и тот, что с склфидл, не помню) - там надо неравенство на равенство поменять
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38700588
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirandrejkа те, которым удовлетворяют сразу все условиясм.мой вариант запроса (а может, и тот, что с склфидл, не помню) - там надо неравенство на равенство поменять

Я в нём мало что понимаю.

Если можешь, подставь туда мои поли и таблицы, может чё пойму. прокомментируй логику , пожалуйста.

tablizca_izobrazhenij (id, izobrazheniya)
tablizca_slov (id, slova)
tablizca_svyazej (id_izobrazheniya, id_slova)

А в моём простом варианте никак уже не вырулить?
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38700683
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну хоть скажите, какие темы изучить в MySQL? Я не знаю возможностей его логики. Если просто синтаксис, то я могу почитать, но тут упёрся, что даже не знаю, что читать. Всё читать, чтоб понять, что мне поможет — это затянется… Хочется сделать, чтоб хоть как-то фурычило, хочу посмотреть вообще, что это получится, а потом править, править, улучшать и править. Мне тут ребята предлагали варианты, но я не понимаю некоторые части кода — это синтаксис там или их условные обозначения. Прошу расписать логику, что делает та конструкция, которую вы мне предлагали.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38700863
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уже и так извратился — не помогает почему-то… ПОЧЕМУ? ПОЧЕМУ? ПОЧЕМУ? ПОЧЕМУ? ПОЧЕМУ? ПОЧЕМУ? ПОЧЕМУ?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
//#### ФОРМИРУЕМ ЗАПРОС второго варианта ################
	//#######################################################
	$osnova_stroki_zaprosa = implode("', '", $oporn_slova_bez_probelov);//делаем из массива опорных слов основу строки для sql запроса
	$stroka_zaprosa = "'" . $osnova_stroki_zaprosa . "'";//окончательно формируем строку для sql запроса
	
	$massiv_id_slov_iz_bd = mysql_query
	("
	SELECT `id` FROM `tablizca_slov` WHERE `slova` IN (" . $stroka_zaprosa . ")
	");
	
	$m = 0;
	while ($data = mysql_fetch_array($massiv_id_slov_iz_bd))
		{
		$massiv_id_slov[$m] = $data['id'];
		$m++;
		}
	
	$stroka_zaprosa_2 = implode(" AND `id_slov` = ", $massiv_id_slov);
	
	//print_r ($stroka_zaprosa_2);
	
	$rezultat_podbora = mysql_query
	("
	 SELECT `slova` FROM `tablizca_slov` WHERE `id` IN
	(SELECT `id_slov` FROM `tablizca_svyazej` WHERE `id_izobrazhenij` IN 
	(SELECT `id_izobrazhenij` FROM `tablizca_svyazej` WHERE `id_slov` = " . $stroka_zaprosa_2 . "))
	");
	
	print_r($rezultat_podbora); ТУТ ВЫВОДИТ ЭТО — Resource id #4. Что это значит?
	//#######################################################
	//#######################################################
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38700864
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
$m = 0; и $m++; лишние
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38700867
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrejk$m = 0; и $m++; лишние

Ошибся, не лишние… Уже с ума схожу)
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38701627
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkЯ в нём мало что понимаю.

Если можешь, подставь туда мои поли и таблицы, может чё пойму. прокомментируй логику , пожалуйста.

16310800
16311976

А в примере Сударя007 и комментарии есть.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38701658
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я благодарен за такие подробные примеры с комментариями, но, видно, мне нужно подучиться, чтобы их понять.
Я пока не могу понять, что такое:
w.нужные_поля
words w
f2w.idfile=f.id
t0
и т. д…
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38701675
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkЯ пока не могу понять, что такое:
>w.нужные_поля
Это и есть нужные поля. Например, w.id
>words w
Правильней было бы написать words AS w - это задание псевдонима таблицы в запросе. Чтобы каждый раз полное имя не набирать. В моём примере в общем-то всё равно, а вот с вашими названиями таблиц сэкономит кучу места и добавит читабельности (имхо).
>f2w.idfile=f.id
Эээ... это условие связи. "Ид файла в таблице связей"="ид файла в таблице файлов"
>t0
Опять же псевдоним, но не для имеющейся таблицы, а для результата подзапроса.
>и т. д…
А далее вам надо почитать что-нибудь про скл.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38701725
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejk , если хотите конкретной помощи - укажите (желательно под спойлером) DDL ваших таблиц и несколько строк тестовых данных (не скриншотами, а текстом), а так же результат, который требуется получить конкретно на этих данных.

Раз уж с самостоятельной адаптацией нескольких готовых вариантов такие проблемы...
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38702104
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007 andrejk , если хотите конкретной помощи - укажите (желательно под спойлером) DDL ваших таблиц и несколько строк тестовых данных (не скриншотами, а текстом), а так же результат, который требуется получить конкретно на этих данных.

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

Это я сделаю попозже, не могу сразу всё охватить. Сейчас пока у меня такой вопрос всплыл… Да, кстати, вот так решил примитивным синтаксисом запрос:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
[SRC sql]for ($i = 0; $i < $kolichestvo_opornyx_slov; $i++)
	{
		//выбираем id наборов, с которыми связаны заданные пользователем слова
		$massiv_osnovy_zaprosa[$i] = "
		(SELECT id_naborov FROM tablizca_svyazej WHERE id_slov = (SELECT id_sl FROM tablizca_slov WHERE slova = '" . $oporn_slova_bez_probelov[$i] . "')
		";//но здесь не хватает закрывающих скобок для SQL запроса
		}
		
$osnova_zaprosa = implode(" AND id_naborov IN ", $massiv_osnovy_zaprosa);

$zakryvayushhchie_skobki = ")";

for ($i = 0; $i < $kolichestvo_opornyx_slov; $i++)//нужное число закрывающих скобок
{
	$zakryvayushhchie_skobki .= ")";
	}
	
$SQL_zapros = "
	SELECT slova FROM tablizca_slov WHERE id_sl IN
	(SELECT id_slov FROM tablizca_svyazej WHERE id_naborov IN
	" . $osnova_zaprosa . $zakryvayushhchie_skobki . "
	";

[/SRC]

Вопрос такой: почему по отдельности части запроса выполняются быстро, а вместе зависают минут на 8? Не могу понять, как БД на последнем этапе ищет, что её так грузит.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
#часть 1 (при подстановке сюда результата части 2 вручную)
SELECT slova
FROM tablizca_slov
WHERE id_sl
IN 

#часть 2(
SELECT id_slov
FROM tablizca_svyazej
WHERE id_naborov
IN (
SELECT id_naborov
FROM tablizca_svyazej
WHERE id_slov = ( 
SELECT id_sl
FROM tablizca_slov
WHERE slova = 'кирпич' )))
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38702154
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejk, потому что (и вроде бы я тут об этом уже писал) IN-подзапросы до версии 5.5 включительно очень хреново обрабатываются оптимизатором. JOIN-вариант, который вы отказываетесь разбирать, на хоть сколько-нибудь значимых объёмах работает быстрее, ну и всякие плюшки (наподобие все слова/не все слова/только M из N слов) к нему проще прикрутить.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38702162
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirandrejk, потому что (и вроде бы я тут об этом уже писал) IN-подзапросы до версии 5.5 включительно очень хреново обрабатываются оптимизатором. JOIN-вариант, который вы отказываетесь разбирать, на хоть сколько-нибудь значимых объёмах работает быстрее, ну и всякие плюшки (наподобие все слова/не все слова/только M из N слов) к нему проще прикрутить.

Ну понятно, что хреново, но это общий ответ, а я хочу понять, где жрутся ресурсы, что там произходит. Там какие-то циклы, но я не могу понять, какие и гдк. Просто хочу понять и всё, немогу без этого дальше нормально жить.

А JOIN я подучу. Сейчас пока знакомлюсь с псевдонимами.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38702172
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkа я хочу понять, где жрутся ресурсы, что там произходит. Там какие-то циклы, но я не могу понять, какие и гдкна примере:
Код: sql
1.
2.
select t1.a
from t1 where t1.id=(select id from t2 where t2.trololo=100500)

Выделенный подзапрос при выполнении запроса будет выполнен столько раз, сколько записей в таблице t1, и пофиг, что с t1 его результат не связан вообще никак. В некоторых других СУБД оптимизаторы это видят и выполняют такие подзапросы один раз. Но не в мускле.
А вы их в 3 слоя один на другой нагромождаете :)
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38702199
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробую разбить на два подзапроса… У меня прогресс, я смог прочесть ваш пример)
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38703569
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007 andrejk , если хотите конкретной помощи - укажите (желательно под спойлером) DDL ваших таблиц и несколько строк тестовых данных (не скриншотами, а текстом), а так же результат, который требуется получить конкретно на этих данных.

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

Ух… Что такое спойлер? Как указать DDL? Я почитал и так понял, что это комманды, которыми создавалась БД? Текст комманд создания БД указать? Как получить тестовые данные?
...
Рейтинг: 0 / 0
25 сообщений из 109, страница 3 из 5
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как организовать бд для вот такой задачи?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]