Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Лимитирование записей с определенным значением 
:(
    Опции темы
IZ@TOP
Дата 15.8.2005, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: нет
Всего: 73



Суть такая. Есть две таблицы, они связаны по ID первой таблицы:

Код

.. from table1 as tb1, table2 as tb2 where tb2.tb1_id = tb1.id ... order by tb2.cdate


Нужно отобрать за раз по три записи из tb2 для каждого ID таблицы tb1.

Т.е. если у нас есть записи в таблице tb1:

ID name
1 x1
2 x2
3 x3

Нужно получить по три записи из tb2

tb2.ID tb2.tb1_id tb1.name
398 | 1 | xxe1
276 | 1 | xxe2
198 | 1 | xxe10
398 | 2 | xxe1
276 | 2 | xxe2
198 | 2 | xxe10
398 | 3 | xxe1
276 | 3 | xxe2
198 | 3 | xxe10
...



--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Bikutoru
Дата 15.8.2005, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 1
Всего: 22



А можно привести весь запрос и структуру таблиц?!


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Ignat
Дата 15.8.2005, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Цитата(Bikutoru @ 15.8.2005, 14:09)
А можно привести весь запрос

Так это Изатоп у нас и спрашивает.


--------------------
Теперь при чем :P
PM   Вверх
Bikutoru
Дата 15.8.2005, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 1
Всего: 22



Цитата(Bikutoru @ 15.8.2005, 14:09)
А можно привести весь запрос

Действительно...
Я имел в виду то, что уже есть без купюр (блоки WHERE и SELECT)...



--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
IZ@TOP
Дата 16.8.2005, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: нет
Всего: 73



Пожалуйста.

Это запрос. Но он возвращает все записи связанные с категориями а не то что нужно - т.е. по несколько записей из каждой категории.

Код

select sub_a.id_sec, rda.alias as path, rda.name as rubric, ada.alias,
ada.id, ada.cdate, ada.name, ada.descr, ada.author
from cv_rubrics_binds as sub_a, cv_rubrics_data as rda, cv_articles_data as ada
where sub_a.id_primary = %{1 i} and rda.id = sub_a.id_sec and rda.status != "close"
and ada.rubric_id = sub_a.id_sec order by ada.cdate desc

Вот струткура тех таблиц которые учавствуют в запросе:

Код

# MySQL-Front Dump 2.5
#
# Host: localhost   Database: wa
# --------------------------------------------------------
# Server version 4.1.10a-nt


#
# Table structure for table 'cv_articles_data'
#

DROP TABLE IF EXISTS cv_articles_data;
CREATE TABLE cv_articles_data (
  id bigint(20) unsigned NOT NULL auto_increment,
  group_id int(11) unsigned NOT NULL default '0',
  rubric_id int(11) unsigned NOT NULL default '0',
  alias varchar(50) NOT NULL default '',
  lang char(2) NOT NULL default 'ru',
  author varchar(40) NOT NULL default '',
  name varchar(100) NOT NULL default '',
  descr text,
  title varchar(150) NOT NULL default '',
  body text,
  cdate int(10) unsigned zerofill NOT NULL default '0000000000',
  PRIMARY KEY  (id),
  UNIQUE KEY alias (alias,lang),
  KEY quick_anonses (cdate),
  KEY group_themes (group_id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;



#
# Table structure for table 'cv_rubrics_binds'
#

DROP TABLE IF EXISTS cv_rubrics_binds;
CREATE TABLE cv_rubrics_binds (
  id_sec int(11) unsigned NOT NULL default '0',
  id_primary int(11) unsigned NOT NULL default '0',
  PRIMARY KEY  (id_sec,id_primary),
  KEY sec (id_primary,id_sec)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;



#
# Table structure for table 'cv_rubrics_data'
#

DROP TABLE IF EXISTS cv_rubrics_data;
CREATE TABLE cv_rubrics_data (
  id int(11) unsigned NOT NULL auto_increment,
  alias varchar(40) character set latin1 collate latin1_bin NOT NULL default '',
  style varchar(40) default NULL,
  theme varchar(40) default NULL,
  lang char(3) NOT NULL default 'ru',
  title varchar(150) NOT NULL default '',
  name varchar(50) NOT NULL default '',
  descr text,
  inc_doc_id int(11) unsigned NOT NULL default '0',
  inc_mod_id int(11) unsigned NOT NULL default '0',
  group_id int(11) unsigned NOT NULL default '0',
  cdate int(10) unsigned zerofill NOT NULL default '0000000000',
  udate int(10) unsigned zerofill NOT NULL default '0000000000',
  seq smallint(5) NOT NULL default '1000',
  status enum('visible','hidden','close') NOT NULL default 'visible',
  ico varchar(100) NOT NULL default '',
  allow_rewrite_style tinyint(1) unsigned NOT NULL default '0',
  allow_rewrite_theme tinyint(1) unsigned NOT NULL default '0',
  PRIMARY KEY  (id),
  UNIQUE KEY alias (alias,lang),
  KEY idx (alias,lang,status),
  KEY secs_primary (lang,status),
  KEY sort_of (seq),
  FULLTEXT KEY ft_idx (name,title)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;



--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Bikutoru
Дата 16.8.2005, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 1
Всего: 22



Честно говоря, сейчас разбираться во всем этом времени нет, но возможно это поможет
Код

SET @counter  = 0;
SET @previuos = "";

SELECT     ad.id,
                 @counter  := IF(ad.rubric_id=@previous, @counter + 1, 0) AS cnt
                 @previous := ad.rubric_id AS id_rubric
FROM         cv_articles_data AS ad
WHERE      cnt < 3
ORDER BY  rubric_id;



--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
IZ@TOP
Дата 17.8.2005, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: нет
Всего: 73



Bikutoru, ты уверен что подобная конструкция прокатит? Что-то мне MySQL ругается...
Код

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL IF(ad.rubric_id=@previous, @counter + 1, 0) AS cnt FROM cv_



--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Ignat
Дата 17.8.2005, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Bikutoru, в WHERE нельзя подставлять вычисленные значения. Но это можно делать в HAVING.


--------------------
Теперь при чем :P
PM   Вверх
Bikutoru
Дата 17.8.2005, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 1
Всего: 22



Цитата
Ты уверен что подобная конструкция прокатит?

Нет, не уверен. Я её не проверял smile

Цитата
в WHERE нельзя подставлять вычисленные значения. Но это можно делать в HAVING

Спасибо за уточнение.

Я немного поэкспериментировал, вот получилась:
Код

SET @saved = "#";
SELECT    
    id,
    name,
    alias,
    rubric_id,
    @saved := CONCAT(@saved, rubric_id, "#") AS s,
    INSTR(@saved, CONCAT("#", rubric_id, "#", rubric_id, "#", rubric_id, "#")) AS flag
FROM
    cv_articles_data
HAVING 
    flag = 0
ORDER BY
    rubric_id;

Тестировал на MySQL 4.1.0-alpha-max-nt. Работала...

Это сообщение отредактировал(а) Bikutoru - 17.8.2005, 14:09


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
IZ@TOP
Дата 18.8.2005, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: нет
Всего: 73



У меня 4.1.10a-nt, но все равно ругается мол "NULL CONCAT(@saved, rubric_id...)..."
Добавлено @ 08:31
Цитата(http)

Примечание: в команде SELECT каждое выражение оценивается только при отправлении клиенту. Это означает, что в условиях HAVING, GROUP BY, or ORDER BY не следует ссылаться на выражение, содержащее переменные, которые введены в части SELECT этой команды. Например, следующая команда НЕ будет выполняться так, как ожидалось:

mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM table_name HAVING b=5;

Причина в том, что переменная @aa не будет содержать значения текущей строки, в то время как значение id в предыдущем выражении является строкой.

Действует правило никогда не создавать и не использовать одну и ту же переменную в одном и том же выражении SQL.


Разъясниьте пожалуйста, а то я не совсем понимаю.

Кстате, если запрос поменять на:


Код

SET @saved = "|";
SELECT    
    id,
    name,
    alias,
    rubric_id,
    @saved = CONCAT(@saved, rubric_id, "|") AS s,
    INSTR(@saved, CONCAT("|", rubric_id, "|", rubric_id, "|", rubric_id, "|")) AS flag
FROM
    cv_articles_data
HAVING 
    flag = 0
ORDER BY
    rubric_id;

То он работает. Только вот выводит не по тому количеству... и flag = 0 и s = 0 всегда.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Ignat
Дата 18.8.2005, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Цитата(IZ @ 18.8.2005, 09:23)
@saved = CONCAT(@saved, rubric_id, "|") AS s,

А что это у тебя знак равенства вместо присваивания стоит?
@saved := CONCAT(@saved, rubric_id, "|") AS s,


--------------------
Теперь при чем :P
PM   Вверх
IZ@TOP
Дата 18.8.2005, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: нет
Всего: 73



Цитата(Ignat @ 18.8.2005, 11:13)
что это у тебя знак равенства вместо присваивания стоит?
@saved := CONCAT(@saved, rubric_id, "|") AS s,

А с ним не работает. В доках сказано что иногда можно его использовать как знак присваивания.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Bikutoru
Дата 18.8.2005, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 1
Всего: 22



Цитата(IZ @ 18.8.2005, 13:17)
В доках сказано что иногда можно его использовать как знак присваивания.

Насколько мне известно, "=" является знаком присвоения только в конструкции SET var=value; В SELECT нужно использовать ":=". А насчет ошибки, попробуй проверить работает ли присвоение:
Код

SET @c = 0;
SELECT @c:=@c+1 FROM cv_articles_data;



--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
IZ@TOP
Дата 19.8.2005, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: нет
Всего: 73



Вот блин... на сервере работает, а у меня нет... в чем может быть интересно проблема?

Не, все работает. Это почему то в MySql Front'e не работает...


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Bikutoru
Дата 19.8.2005, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 1
Всего: 22



Точно, в MySQL Front не работает. Может, он их как-то по-особому парсит перед отправкой?
Код
SHOW TABLES\G
тоже не работает, хотя в консоли все хорошо...

Это сообщение отредактировал(а) Bikutoru - 19.8.2005, 15:20


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0598 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.