Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » MySQL Помогите составить запрос

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

Открыть новую тему     Написать ответ в эту тему

IFKey



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос следующий, выбираю две таблицы с условием связкой g_id=id, но во второй таблице не хватает полей, как можно сделать чтобы выбирались пустые значения.
 
Визуализирую:
тут содержится 3 записи, одна из них соответствует id из таблицы с группой, соответственно выбирается 1 строка, а хотелось бы 3.
id g_id содержание колонки

id имя группы


Цитата:
SELECT a.id,a.g_id,a.title,b.name as g_name  FROM names a, groups b WHERE a.g_id=b.id ORDER BY a.id

Всего записей: 331 | Зарегистр. 20-03-2007 | Отправлено: 13:50 13-04-2012 | Исправлено: IFKey, 14:08 13-04-2012
RebelNeo

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос может и банален, но разобраться сам в этом не могу. Прошу помощи. Сделал собачью бд родословных на известном движке (PHP) с использованием MySQL. Пользователи жалуются, что кнопка "Изменить" (http://www.pedigree.16mb.com/details.php?id=63207) доступна всем зарегистрированным пользователям, а не только тому, кто сделал родословную. Ограничение только на anonymus user. В manage.php прописано лишь это:  
if ($_CURRENT_USER->is_anonymous) {
    $returnto = returnto_url_enc();
 
    $login="$USERS_BASE_URL/login.php?returnto=$returnto";  
 
  Header("Location: $login");
 
  exit;
 
}
А надо, чтобы из таблицы MySQL "dog", где есть графа "creator" с указанием на конкретный user_id (который и создал родуху данной собаки) бралась инфа и делался затык на редактирование другим пользователям. А еще лучше, чтобы сама кнопка "Изменить" была видна лишь для creator, а для других невидима. Код самой кнопки прописан так:
<form action='manage.php' method="get">
<input type="hidden" name="id" value="<?php echo $currId ?>"/>
<input type="submit" class="button" name="action" value="Изменить"/>
 
Здесь $currId это dog_id
 
Заранее спасибо

Всего записей: 686 | Зарегистр. 15-01-2007 | Отправлено: 16:53 13-04-2012 | Исправлено: RebelNeo, 16:57 13-04-2012
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RebelNeo
и где сам вопрос то?  
в чем сложность то? перед тем как "рисовать" кнопку, делаете запрос в базу, получаете данные, сравниваете владелец это или нет.
аналогично делаете при получении данных, чтобы не "взломали"
 
приведенной информации недостаточно, чтобы сказать что то уж совсем конкретное (да и разбираться в чужом коде не каждый захочет). смысл реализации то довольно простой.

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 05:57 17-04-2012 | Исправлено: Cheery, 05:58 17-04-2012
ILYA INDIGO



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SQL-запрос для MySQL (MariaDB) 5.5.23
Подсчёт кол-ва вхождений символа в строку.
 
Имею упрощённый вид каталог с неограниченным уровнем вложенности
Код:
CREATE TABLE `ilya_dir_cat`
(
    `id` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `pid` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
    `title` VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
)
ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;

Код:
Первый уровень с `id`=1 `pid`='0'
Первый уровень с `id`=2 `pid`='0'
Второй уровень родителя с `id`=1 - `id`=3 `pid`='1'
Второй уровень родителя с `id`=1 - `id`=4 `pid`='1'
Третий уровень родителя с `id`=3 - `id`=5 `pid`='1,3'
Четвёртый уровень родителя с `id`=5 - `id`=6 `pid`='1,3,5'

Смысл в том что `pid` (parent id) через запятую последовательно содержит `id` всех своих предков, начиная с самого первого.
 
Задача состоит в том, что бы по-мимо основного вывода, нужно посчитать и вывести уровень каждого элемента, начиная с нуля первый - 0, второй - 1, третий - 2 и т.д.
У меня сразу возникла идея проверить на 0 и если больше, то прибавить к стоке ',0' И подсчитать кол-во вхождений запятой и вернуть или его или 0.
Но такой функции для MySQL я не обнаружил. может плохо искал или в новой версии 5.5 есть?
Нащёл интересную функцию INTERVAL она выполняет то что мне нужно, но при условии что `id` уменьшаются, а не увеличиваются, как у меня при этом использование REVERSE не подходит, так как если строка '56,57,58,59,60' вместо ожидаемой '60,59,58,57,56' я получу '06,95,85,75,65' что меня не устроит
Возможно это осуществить адекватными средствами MySQL 5.5, кроме как JOIN-ить с подсчётом длины и первого вхождения со смещением и посчётов этих смещений и прочего?
Спедствами PHP я это легко могу осуществит, но хотелось бы это сделать именно средствами MySQL

Всего записей: 38 | Зарегистр. 18-11-2007 | Отправлено: 05:27 28-04-2012 | Исправлено: ILYA INDIGO, 05:28 28-04-2012
Tstf



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Ситуация
 
В базе файл  
 
DVD плеер Onkyo DR-645
 
в переменной - DVD плеер Onkyo DR 645  (без дефиса перед 645)
 
Во время обращения в базу заношу каждое слово переменной в массив и получаю запрос вида
 
SELECT SQL_CALC_FOUND_ROWS *, MATCH (name) AGAINST ('>»DVD плеер Elenberg DVD 2016U» <(+DVDElenbergDVD2016U)' IN BOOLEAN MODE) AS rel FROM `catalog_goods` WHERE MATCH (name) AGAINST ('>»DVD плеер Elenberg DVD 2016U» <(+DVDElenbergDVD2016U)' IN BOOLEAN MODE) ORDER BY `rel` DESC LIMIT 0, 5
 
Но в базе запись с дефисом (DVD плеер Onkyo DR-645) не находит.
 
Какой должен быть запрос?
 
========================================================
Ситуация 2
 
В базе товар SHARP SJ 642 NSL
 
В переменной Sharp SJ-642NSL
 
Можно ли как-то найти фразу из переменной в базе? Сразу поставлю рамки - мы не знаем, в каком месте пробел есть)
 
 
Спасибо.

----------
Заработок 2.0

Всего записей: 788 | Зарегистр. 22-04-2003 | Отправлено: 23:28 06-05-2012
bossbel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть 4 таблицы residence, level1, level2, objects в каждой residence, level1, level2 есть поле OBG_ID, которое совпадает с какой либо записью в таблице objects. как эти таблицы выборку из этих таблиц объединить в общий результат, чтобы для каждой записи из таблиц  residence, level1, level2 выбралось соответствующее значение из objects  по полю OBG_ID.  
Для пояснения residence - имя города, села, улуса и т.д., level1- имена областей, республик, регионов, level2 - имена районов в области, objects - содержит данные типа "город", "атаномный округ", "село", "улус", "ресублика" и т.д.  
 
данные из residence, level1, level2 выбираются так  
SELECT * FROM residence,gns,population, level1, level2,  
WHERE (gns.CODEID=population.CODEID)  
and (gns.CODEID = residence.CODEID)
and (residence.L1_CODEID=level1.CODEID)  
and (residence.L2_CODEID= level2.CODEID)
 
на лишние таблицы не обращайте внимания, с ними все в порядке, интересут только таблицы residence, level1, level2, objects  
мне здесь ответили  
 
SELECT * FROM residence r, objects o, population p, level1 l1, level2 l2,  
WHERE g.OBG_ID = p.OBG_ID  
AND o.OBG_ID = r.OBG_ID  
AND o.OBG_ID = l1.OBG_ID  
AND o.OBG_ID = l2.OBG_ID
 
это не то.... просто если связать остальные поля других таблиц, то для одной строчки результата запроса из всех таблиц имеется несколько полей OBG_ID с разными значениями .... запрос формирует  в результате например (OBG_ID= 9)БАшкортостан - (OBG_ID= 24)Уфимский - (OBG_ID= 7)УФА .... надо чтобы было Республика БАшкортостан - район Уфимский- город УФА.....

Всего записей: 2 | Зарегистр. 17-05-2012 | Отправлено: 18:21 17-05-2012 | Исправлено: Cheery, 18:44 17-05-2012
ubian



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
del

Всего записей: 623 | Зарегистр. 22-07-2011 | Отправлено: 18:39 17-05-2012 | Исправлено: ubian, 18:39 17-05-2012
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bossbel

Цитата:
просто если связать остальные поля других таблиц, то для одной строчки результата запроса из всех таблиц имеется несколько полей OBG_ID с разными значениями .... запрос формирует  в результате например (OBG_ID= 9)БАшкортостан - (OBG_ID= 24)Уфимский - (OBG_ID= 7)УФА .... надо чтобы было Республика БАшкортостан - район Уфимский- город УФА....

покажите пример данных (по несколько значений из каждой таблицы)
потому что вы сами сказали, что  

Цитата:
поле OBG_ID, которое совпадает с какой либо записью в таблице objects



----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 00:44 18-05-2012
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем привет,
вот есть код:
 

Код:
$admin = mysql_query("SELECT COUNT(*) AS all_bans, admin_nick FROM `server_bans` GROUP BY admin_nick ORDER BY count(*) DESC LIMIT 5");

 
колупаю я его очень долго, и не могу сделать такую задачу, чтоб считывалю "всего" количество запросов, в бд server_bans и server_story
 
тоесть,

Код:
server_bans
id | admin_nick
3 | admin1
2 | admin2
4 | admin2
5 | admin3
1 | admin2

 
 

Код:
server_story
id | admin_nick
3 | admin2
2 | admin3
4 | admin4
5 | admin1
1 | admin1

 
в результате, должно получиться (по убыванию):
admin2 - 4
admin1 - 3
admin3 - 2
admin4 - 1

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 21:33 05-06-2012 | Исправлено: Sutar, 21:33 05-06-2012
CheRt



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Если верно понял задачу, что-то навроде:

Код:
 
SELECT * FROM (
  SELECT COUNT(*) AS all_bans, admin_nick FROM (
    SELECT id, admin_nick FROM server_bans
    UNION
    SELECT id, admin_nick FROM server_story
  ) bans GROUP BY admin_nick
) bans_by_admin ORDER BY all_bans DESC LIMIT 5
 

*запрос не проверял.

----------
В огне бода нет и не будет!
До встречи в СССР 2.0!

Всего записей: 1118 | Зарегистр. 14-12-2001 | Отправлено: 14:39 06-06-2012
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CheRt
можно сократить больше и информация не точная...

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 23:25 06-06-2012
kosola



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Репост отсюда
 
Доброго времени, уважаемые знатоки  
 
Столкнулся с легкой, на первый взгляд, задачей, но вот все никак не могу найти достойного решения.  
Исходные данные:  
Две таблицы, связанные между собой:  
t1: uid, pid, originalname, language  
где uid - основной ключ, pid - айди родителя (из этой же таблицы), language - язык "документа"  
t2: uid, pid, title, language  
где uid - основной ключ, pid - t1.uid, title - заголовок, language - перевод заголовка  
 
В системе забиты 1-5 языков (динамически настраивается)  
На данной момент в первой таблице 14т записей, во второй 707т  
 
Задача: Вывести значения из первой таблицы, отсортированные по заголовку (т.е. по t1.originalname или t2.title). Причем с, так называемым, followback, т.е. для документа сначала берется текущий язык пользователя, если его нет, язык системы, потом любые другие языки, а если значение в t2 отсутствует, то брать originalname.  
 
Результат выводиться постранично.  
 
 
Что я делал:  
-Считывал все данные, собирал в массив, сортировал в пхп, выводил результат. Работает, но 80сек, это непростительно долго.  
 
-Пытался составить один большой запрос, но споткнулся на группировке. В результате GROUP BY t1.uid возвращается непонятно какая строка. Т.е. я составлял запрос, в котором выводятся все значения из t1 и t2, отсортированные по языку ("по важности языка"), но группировка берет не первое значение, а произвольное.  
 
запрос вида  

Код:
 
SELECT t1.uid,t1.pid,t1.originalname,t1.language, t2.value,t2.language as lang, IF(t2.language='ru',0,IF(t2.language='en',1,IF(t2.language='de',2,IF(t2.language='in',3,IF(t2.language='oname',4,5))))) as lsort  
FROM t1 LEFT JOIN t2 ON t1.uid=t2.pid AND t2.language IN ("ru","en","de","in","oname")  
WHERE t1.uid IN ( subquery ) ORDER BY lsort asc
 

Условия с IF только для того, чтобы перевести языки в цифры по приоритетности, если можено сделать проще - буду рад.
 
Результат, пример:  
1, 1, ориг.имя.1, ру, перевод11, ру, 0  
2, 2, ориг.имя.2, ру, перевод21, ру, 0  
3, 3, ориг.имя.3, ру, перевод31, ру, 0  
1, 1, ориг.имя.1, ру, перевод12, ен, 1  
4, 4, ориг.имя.4, ру, перевод42, ен, 1  
5, 5, ориг.имя.5, ру, перевод52, ен, 1  
...  
 
Т.е. если исключить повторения, так что бы остались значения с минимальным lsort, проблема была бы решена, ну или первая ее часть. вроде...  
 
 
Спасибо за внимание. надеюсь на Вашу помощь.

Всего записей: 134 | Зарегистр. 12-11-2007 | Отправлено: 11:30 19-07-2012
Kaylang



Вредный и упрямый
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kosola

Цитата:
Считывал все данные, собирал в массив, сортировал в пхп, выводил результат.  

Зачем? Не достаточно было определить язык вывода и сделать соответствующий запрос?

Всего записей: 38546 | Зарегистр. 29-08-2002 | Отправлено: 12:23 19-07-2012
kosola



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нет. Я уже упоминул, что если перевода по текущему языку нету, то нужно брать следующий перевод (по ранжиру, который я сам составляю), если следующего перевода нету, то брать оригинальное имя.
 
Добавлено:
Упрощаю задачу.
Есть "таблица" с колонками uid - порядковый номер, title - титл, lang - вес языка (0-10)
и имеет следующие значения:
1, aaaa, 0
2, gggg, 0
2, abcd, 1
1, bcdd, 1
3, mmm, 1
4, cccc, 2
...
Задача, выбрать одним запросом все не повторяющиеся значения, причем оставлять то значение, у которого lang минимальный
т.е. должно получиться что-то типа
1, aaaa, 0  
4, cccc, 2 - так как записей с меньшим lang нет
2, gggg, 0
3, mmm, 1 - тоже самое
...

Всего записей: 134 | Зарегистр. 12-11-2007 | Отправлено: 12:31 19-07-2012
Kaylang



Вредный и упрямый
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kosola

Цитата:
Нет. Я уже упоминул, что если перевода по текущему языку нету, то нужно брать следующий перевод (по ранжиру, который я сам составляю), если следующего перевода нету, то брать оригинальное имя.  

Вот это и реализуй в php, а в БД уже только запрос согласно языка вывода.
 
Добавлено:

Цитата:
Задача, выбрать одним запросом все не повторяющиеся значения, причем оставлять то значение, у которого lang минимальный
т.е. должно получиться что-то типа  

Извини, но это бред.
Допустим у тебя на сайте 5 языков.
en - дефолт
ru
fr
de
es
 
И не все страницы переведены на все языки. Зайдет к тебе испанец и будет видеть часть страниц на испанском, часть на французком, часть на русском, ну и на английском.
Думаешь он еще раз придет?

Всего записей: 38546 | Зарегистр. 29-08-2002 | Отправлено: 13:02 19-07-2012
kosola



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Вот это и реализуй в php, а в БД уже только запрос согласно языка вывода.  

Пробовал, очень медленно работает. Так как я должен всю базу прочитать, отсеить ненужные и отсортировать. 80секунд.  
 

Цитата:
Извини, но это бред.  

Извиню, я так и сказал шефу. По хорошему, нужно брать текущий и дефолтовый язык. В любом случае, проблемы не решает, так как в таблице все равно остаются повтороящиеся записи, хоть и в два раза меньше.

Всего записей: 134 | Зарегистр. 12-11-2007 | Отправлено: 13:31 19-07-2012
Kaylang



Вредный и упрямый
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kosola

Цитата:
Пробовал, очень медленно работает.

Насколько я понял, ты пробовал загрузить все записи в массив и с ними работать.

Цитата:
Считывал все данные, собирал в массив, сортировал в пхп, выводил результат. Работает, но 80сек, это непростительно долго.

или я неправильно понял?
Надо на уровне php определить язык посетителя.

Цитата:
По хорошему, нужно брать текущий и дефолтовый язык. В любом случае, проблемы не решает, так как в таблице все равно остаются повтороящиеся записи, хоть и в два раза меньше.  

Еще как решает.  
$sql_lang_user = select (записи с языком посетителя)
if ($sql_lang_user)
{
выводим записи с языком посетителя ($sql_lang_user)
} else {
$sql_for_output = select (записи с дефолтным языком)
выводим записи с дефолтным языком
}
как-то так.
 

Всего записей: 38546 | Зарегистр. 29-08-2002 | Отправлено: 13:48 19-07-2012
kosola



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Насколько я понял, ты пробовал загрузить все записи в массив и с ними работать.  

именно
 

Цитата:
Надо на уровне php определить язык посетителя.  

Нет, это не катит.  
если по языку пользователя ничего не найдено (таблица2), то должен браться дефолтовый (так же из таблицы 2), если дефолтового нет, то подставляться оригинальное имя (а это уже таблица 1)
 
т.е. должны быть отсортированы. В твоем случае, все равно нужно считывать все данные и сортировать в пхп. А это, как я уже сказал, длится достаточно долго.
 

Всего записей: 134 | Зарегистр. 12-11-2007 | Отправлено: 14:30 19-07-2012
Kaylang



Вредный и упрямый
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kosola

Цитата:
если по языку пользователя ничего не найдено (таблица2), то должен браться дефолтовый (так же из таблицы 2), если дефолтового нет, то подставляться оригинальное имя (а это уже таблица 1)  

Значит сделать на 1 запрос больше.
if ($sql_lang_user)
{
выводим записи с языком посетителя ($sql_lang_user)
} elseif ($sql_lang_default) {
выводим записи с дефолтным языком
} else {
выводим оригинальный вариант
}  
 
ЗЫ. Интересно, что быстрее обработает задачу на каком языке выводить: php или sql?

Всего записей: 38546 | Зарегистр. 29-08-2002 | Отправлено: 14:50 19-07-2012
kosola



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kaylang
Ты не понял.  
 
Возвращается список, достаточно большой 10тыс (к примеру), который должен быть отсортирован по заголовку. А заголовок находится в разных местах: в двух таблицах, причем в последний в нескольких строчках.
Я могу получить значение, проверить, есть ли для него перевод, если нету поискать еще. НО, я могу получить перевод, который, при условии сортировки, должен находиться в конце. Следовтельно, нужно получить все варианты и сортировать массив в пхп. Как я уже сказал, длиться достаточно долго...
 

Всего записей: 134 | Зарегистр. 12-11-2007 | Отправлено: 15:08 19-07-2012
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

Компьютерный форум Ru.Board » Интернет » Web-программирование » MySQL Помогите составить запрос


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru