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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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

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

Jokerjar79



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
select phone, count(phone) as cnt from phones group by phone having cnt > 1;
 
Как-нибудь так. Ну можно сюда еще юзеров привязать, но нужно ли? Ведь чистить phones будете

----------
www.MyFirstSite.ru - информационный ресурс для начинающих веб-мастеров

Всего записей: 710 | Зарегистр. 08-09-2007 | Отправлено: 10:33 17-02-2011
malefix

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

Цитата:
Есть таблицы users (пользователи) и phones (телефоны), поля такие:  
users.id  
users.name  
phones.phone  
phones.owner  
связаны таблицы так users.id = phones.owner  
 
софт для этой базы писался давно и в нем не было проверки на дублирующиеся телефоны. Сейчас есть такие записи в таблице phones, где phone один, а owner разные (т.е. один телефон записан на разных юзеров)  
 
как мне составить запрос, чтобы он показал какие юзеры имеют одинаковые телефоны, чтобы потом удалить ненужные записи из phones?

 

Цитата:
select phone, count(phone) as cnt from phones group by phone having cnt > 1;  
 
Как-нибудь так. Ну можно сюда еще юзеров привязать, но нужно ли? Ведь чистить phones будете

 
действительно, вроде работает, но теперь другой вопрос - в таблице phones оказалось много записей с одинаковым phone и owner  
как мне удалить только одну из этих записей и оставить другую?
делать выборку двойных записей и потом в цикле пробегаться по ней на php и удалять все кроме первой не хочется

Всего записей: 58 | Зарегистр. 18-11-2008 | Отправлено: 13:38 18-02-2011
CheRt



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
malefix,
сходу в голову приходит примерно вот такой вариант.

Код:
 
CREATE TABLE phones_back (phone INT(3), owner INT(3));
INSERT INTO phones_back SELECT DISTINCT phone, owner FROM phones;
TRUNCATE TABLE phones;
INSERT INTO phones SELECT phone, owner FROM phones_back;
DROP TABLE phones_back;
 



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

Всего записей: 1118 | Зарегистр. 14-12-2001 | Отправлено: 01:35 19-02-2011 | Исправлено: CheRt, 01:37 19-02-2011
Jokerjar79



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

Цитата:
CREATE TABLE phones_back (phone INT(3), owner INT(3));  
INSERT INTO phones_back SELECT DISTINCT phone, owner FROM phones;

можно сразу

Код:
CREATE TABLE phones_back SELECT DISTINCT phone, owner FROM phones;


----------
www.MyFirstSite.ru - информационный ресурс для начинающих веб-мастеров

Всего записей: 710 | Зарегистр. 08-09-2007 | Отправлено: 04:45 19-02-2011
Weinaum



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
вот задумался, как можно, максимально просто, установить базу с дампа, если ряд таблиц надо исключить.  
Т.е. на хосте есть база db1. есть ее дамп - db1.sql
в стандартном варианте все просто - mysql -u user -ppass db1 < /path_to_db1.sql
А если я хочу, чтобы парочка таблиц остались те, что есть?

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 01:10 09-03-2011
The_S

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Weinaum
Изучите подробнее синтаксис mysqldump, там есть параметр --tables можно указать конкретные таблицы для дампа.

Всего записей: 188 | Зарегистр. 13-09-2006 | Отправлено: 01:43 09-03-2011
Weinaum



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ага, снкс, воспользовался параметром --ignore-table=db_name.tbl_name..

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 03:06 09-03-2011
kosorikov1

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
есть база с директориями:
 
 
id parent_id name    
1 0 none    
2 1 serial    
3 1 films    
4 2 a    
5 2 b

 
как бы мне вывести информацию о нужном каталоге и его родительских директориях? Т.е если задан каталог  с id=5, нужно получить  
id name    
1 none    
2 serial    
5 b

 
если id=2
 
id name    
1 none    
2 serial

Всего записей: 102 | Зарегистр. 19-11-2009 | Отправлено: 20:46 17-03-2011 | Исправлено: kosorikov1, 20:47 17-03-2011
myo



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
kosorikov1
Советую для данной проблемы заюзать какое-нить решение для деревьев, например nested sets.

Всего записей: 270 | Зарегистр. 09-09-2002 | Отправлено: 21:02 17-03-2011
kosorikov1

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

Всего записей: 102 | Зарегистр. 19-11-2009 | Отправлено: 21:12 17-03-2011
SphinxSerg



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Привет!
Помогите составить MySQL запрос через SELECT.  
Есть 3 таблицы:
 
   table1
 ----------
 |  part  |
 ----------
 |   51   |
 |   52   |
 |   53   |
 |   54   |
 |   55   |
 |   56   |
 ----------
 
        table2
 --------------------
 |  part  | prod_id |
 --------------------
 |   51   |    1    |
 |   52   |    2    |
 |   53   |    3    |
 |   54   |    4    |
 |   56   |    6    |
 --------------------
 
        table3
 ---------------------
 | prod_id |   name  |
 ---------------------
 |    1    | title_1 |
 |    2    | title_2 |
 |    3    | title_3 |
 |    4    | title_4 |
 |    5    | title_5 |
 |    6    | title_6 |
 ---------------------
 
Надо вывести полностью все строки из table1 и где совпадают table1.part=table2.part вывести из table3 наименования (table3.name). Не знаю, понятно ли изъяснился, но должно получиться примерно такое:
 ------------------------------
 |  part  | prod_id |   name  |
 ------------------------------
 |   51   |    1    | title_1 |
 |   52   |    2    | title_2 |
 |   53   |    3    | title_3 |
 |   54   |    4    | title_4 |
 |   55   |         |         |
 |   56   |    6    | title_6 |
 ------------------------------
 
PS В table2 нет part=55, т.е. там надо пустое вывести.
 
Спасибо.!

Всего записей: 441 | Зарегистр. 07-07-2004 | Отправлено: 09:40 15-03-2012
leosart



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброго времени суток!
Подскажите пожалуйста, можно как-нибудь по-другому составить запрос к базе данных, чтоб она выдала не все десять строк, а только 3 случайных из этих десяти:
SELECT id, name, image
FROM game
ORDER BY pop DESC
LIMIT 0 , 10

Всего записей: 135 | Зарегистр. 05-07-2010 | Отправлено: 16:49 17-03-2012
SphinxSerg



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Извиняюсь за дубль поста, но у меня проблемы с запросами к нескольким таблицам


Цитата:
Привет!
Помогите составить MySQL запрос через SELECT.  
Есть 3 таблицы:
 
   table1
 ----------
 |  part  |
 ----------
 |   51   |
 |   52   |
 |   53   |
 |   54   |
 |   55   |
 |   56   |
 ----------
 
        table2
 --------------------
 |  part  | prod_id |
 --------------------
 |   51   |    1    |
 |   52   |    2    |
 |   53   |    3    |
 |   54   |    4    |
 |   56   |    6    |
 --------------------
 
        table3
 ---------------------
 | prod_id |   name  |
 ---------------------
 |    1    | title_1 |
 |    2    | title_2 |
 |    3    | title_3 |
 |    4    | title_4 |
 |    5    | title_5 |
 |    6    | title_6 |
 ---------------------
 
Надо вывести полностью все строки из table1 и где совпадают table1.part=table2.part вывести из table3 наименования (table3.name). Не знаю, понятно ли изъяснился, но должно получиться примерно такое:
 ------------------------------
 |  part  | prod_id |   name  |
 ------------------------------
 |   51   |    1    | title_1 |
 |   52   |    2    | title_2 |
 |   53   |    3    | title_3 |
 |   54   |    4    | title_4 |
 |   55   |         |         |
 |   56   |    6    | title_6 |
 ------------------------------
 
PS В table2 нет part=55, т.е. там надо пустое вывести.
 
Спасибо.!


Всего записей: 441 | Зарегистр. 07-07-2004 | Отправлено: 16:49 28-03-2012
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
leosart
SELECT d.* FROM (SELECT id, name, image  
FROM game  
ORDER BY pop DESC  
LIMIT 0 , 10) d ORDER BY rand() LIMIT 3
что то такое.
 
 
SphinxSerg
SELECT table1.*, table2.prod_id, table3.name FROM table1 LEFT JOIN (table2 INNER JOIN table3 ON table2.prod_id = table3.prod_id) ON table1.part = table2.part
вместо "пусто" будет NULL

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 21:25 28-03-2012
Agran

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Слабо взадею SQL, но есть задача обработки большого количества данных. Есть большая база с логами прокси сервера.  
Сейчас сервер думает перед выдачей пол минуты.
Код на Perl следующий:

Код:
 
  my $sth = $dbh->prepare("SELECT DISTINCT src_ip FROM packets WHERE DATE(ts) LIKE '$day'");
  $sth->execute();
  while(@row = $sth -> fetchrow_array) {
     
    my $sth2 = $dbh->prepare("SELECT SUM( recv ), SUM( sent ) FROM packets WHERE DATE(ts) LIKE '$day' AND src_ip LIKE '$row[0]'");
    $sth2->execute();    
    ($summa_recv, $summa_sent) = $sth2->fetchrow_array;
    
    print "<tr><td>".$row[0]."</td><td>".&size_view($summa_recv)."</td><td>".&size_view($summa_sent)."</td></tr><br>";
    
  }
 

 
Выводит следующую информацию:  

Код:
 
Потребление за 2012-03-27
IP    Входящий    Исходящий
10.0.0.70    365.2 MB    15.6 MB
10.0.0.114    2.3 GB    139.9 MB
10.0.0.21    11.7 MB    2.9 MB
10.0.0.198    7.6 MB    2.8 MB
10.0.0.47    303.4 MB    6.9 MB
 

Можно ли это всё сделать одним запросом и ещё и отсортировать по SUM( recv ) WHERE src_ip... что бы всё это работало пошустрее ?
 
Добавлено:
Нашёл сам решение:

Код:
SELECT src_ip, SUM(recv) AS sum1, SUM(sent) FROM packets WHERE DATE(ts) LIKE '$day' GROUP BY src_ip ORDER BY sum1 DESC

Выполняет за 3 секунды, то что первый вариант считал 25 секунд!

Всего записей: 27 | Зарегистр. 06-04-2003 | Отправлено: 15:39 29-03-2012
leosart



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

Цитата:
SELECT d.* FROM (SELECT id, name, image  
FROM game  
ORDER BY pop DESC  
LIMIT 0 , 10) d ORDER BY rand() LIMIT 3  
что то такое.  

спасибо, то что надо!!!

Всего записей: 135 | Зарегистр. 05-07-2010 | Отправлено: 03:45 01-04-2012 | Исправлено: leosart, 03:46 01-04-2012
IFKey



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужен совет по составлению структуры таблиц, в частности в html шаблон будут выводится данные (переменные) из базы mysql и эти данные могут быть различной длинны от 0 символов до нескольких тысяч (в основном будет мало символов). Вопрос в следующем, оправданно ли хранить данные этой переменной в поле типа TEXT или лучше сделать VARCHAR(255)? А для больших объемов текста сделать таблицу в связке по id, и проверять каким-то способом наличие существующего и не пустого TEXT поля?

Всего записей: 331 | Зарегистр. 20-03-2007 | Отправлено: 09:19 06-04-2012
ajooluz



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

Цитата:
Вопрос в следующем, оправданно ли хранить данные этой переменной в поле типа TEXT или лучше сделать VARCHAR(255)?

IMHO: TEXT оптимальнее чем VARCHAR+TEXT
А еще мне кажется что для переменных HTML шаблона имеет смысл рассмотреть вариант с хранением переменных типа template_id, key, value

Всего записей: 8 | Зарегистр. 01-04-2012 | Отправлено: 14:52 06-04-2012
IFKey



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

Цитата:
IMHO: TEXT оптимальнее чем VARCHAR+TEXT
А еще мне кажется что для переменных HTML шаблона имеет смысл рассмотреть вариант с хранением переменных типа template_id, key, value

Я где-то читал что поле типа TEXT медленней будет обрабатываться, поэтому вопрос стоит в производительности, вот нашел в что запросе можно использовать условия:

Цитата:
IF(A,B,C)     Если A истина (!= 0 and != NULL), то вернет B, иначе вернет C.
http://www.sql.ru/docs/mysql/rus_ref/sql.shtml#Lfunc

поэтому как вариант можно было бы сделать проверку в запросе VARCHAR поля и если оно равно NULL, то проверять строку TEXT с таким же ID в другой таблице.
В общем есть ли смысл в моей теории или нет?

Всего записей: 331 | Зарегистр. 20-03-2007 | Отправлено: 17:36 06-04-2012
ajooluz



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если сравнивать TEXT и связку VARCHAR + TEXT + IF, я считаю что TEXT оптимальнее во всех отношениях.
Если я правильно понимаю, вы решили хранить в таблицах части HTML кода в виде шаблонов.
В этом случае я бы хранил шаблоны в таблице c полями TEXT, а переменные в отдельной таблице с полями VARCHAR.

Всего записей: 8 | Зарегистр. 01-04-2012 | Отправлено: 09:24 07-04-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