Как выбрать записи и записать их в таблицу через один запрос?

x-yuri

Новичок
А какая разница если они одинаковые? На пример первый же встречный
LONGMAN т.е.
[sql]SELECT DISTINCT(`col1`) FROM `table`[/sql]
выдает то же что и
[sql]SELECT DISTINCT * FROM `table`[/sql]
?

Да но при этом мне нужно выбрать все поля чтобы их значения потом перекинуть в другую таблицу, а этот выбирает только col1
выбирай все поля, в чем проблема?
 

LONGMAN

Dark Side of the Moon..
Нет, не выдает. Короче, в этом таблице есть вопросы и ответы для викторины. То есть co1 - id auto_increment col2 - вопрос, col3 - ответ, и мне нужно что бы значение col3 не повторялось, не смотря на col1 col2.
 

antson

Новичок
Партнер клуба
т.е. у тебя есть таблица с составным ключом
A,Б,В и полями данных Д,Е,Ж,З
нужно выбрать A,Б,В,Д,Е,Ж,З такие ,чтобы
сочетание ключа было уникально, но данные были проинициализированы

решение
select A,Б,В,АГР(Д),АГР(Е),АГР(Ж),АГР(З) from
group by A,Б,В

где АГР - агрегатная функция подходяшая по смыслу
min,max,avg и или другие (см в мане по скл)

-~{}~ 14.03.09 14:03:

LONGMAN
сдается что както не так спроектирована БД у Вас.
исходную задачу и чего на проектировали в студию
 

LONGMAN

Dark Side of the Moon..
Мне нужно уникальность только одного поля. Вот структура таблицы:
PHP:
CREATE TABLE `questions` (
  `number` int(7) UNSIGNED NOT NULL auto_increment,
  `question` text NOT NULL default '',
  `answer` char(100) NOT NULL default '',
  PRIMARY KEY  (`number`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=1;
И мне нужно выбрать все записи где DISTINCT(`answer`) и перекинуть в таком же таблице. То есть без повторов answer
 

x-yuri

Новичок
1) так а какой ты из вопросов с некоторым ответом хочешь перекидывать?
2) почему не сделать 2 таблицы: вопросы, ответы?
 

LONGMAN

Dark Side of the Moon..
1) Все вопросы где ответ не будет повторятся
2) Не вижу особого смысла
 

LONGMAN

Dark Side of the Moon..
1) В таком случае мне нужны записи
1 Вопрос1 Ответ1
2 Вопрос1 Ответ2
2) Думаю здесь это не нужно..
 

x-yuri

Новичок
1) по какому принципу ты выбрал "Вопрос1 Ответ1"? Первый вопрос? Любой вопрос?
2) нормальный подход к проектированию БД: нормализованная БД... а если медленно работает, то тогда уже можно подумать и об оптимизациях
3) а зачем тебе получать список ответов? Я понимаю зачем список ответов на вопрос, но ведь это не твой случай
 

LONGMAN

Dark Side of the Moon..
1) Любой вопрос, не имеет значение.
2) Нет, медленно не работает. Зачем нормализовать таблицу где всего лишь 3 поля? ид, вопрос, ответ. Думаю здесь оптимизация лишнее
3) Потаму что мне не нужны те вопросы на которых повторяются ответы.
 

x-yuri

Новичок
1) указывай в select_expr не только answer, но и question, только не DISTINCT, а GROUP BY
2) оптимизация - это когда все в одной таблице. И оптимизация здесь лишнее
3) что ты такое пытаешься сделать, что тебе нужен список уникальных ответов с любым из вопросов к ним?
 

LONGMAN

Dark Side of the Moon..
1) То есть? SELECT question,answer GROUP BY answer HAVING COUNT(answer) = 1? Так я ведь делал, не подходит..
2) Оптимизация предпочтительнее для меня. То есть пройзводительность
3) Всего лишь удалить из таблицы двойники, троиники и т.д. всех ответов. Не думал что будет так проблематично :)
 

x-yuri

Новичок
1) нет, конечно. Подумай, что делает твой запрос и как его исправить
2) даже если разницы в производительности 2-х вариантов _не будет_?
3) интересная задача. Такое впечателние, что у тебя таблица с ответами, а вопросы - дело такое, все равно на них никто отвечать не будет ))

-~{}~ 15.03.09 02:09:

p.s. оптимизация - это такая штука, которой следует заниматься, когда на то есть причины. Теоретически так будет быстрее - не причина
 

LONGMAN

Dark Side of the Moon..
1) HAVING и COUNT нужны?
2) В нашем случай будет, может и минимальный но всётаки. Ведь гораздо быстрее искать вопрос в одной таблице используя PRIMARY KEY чем с начала искать вопрос а потом с помошью его ключа искать в другую таблицу его ответ? Или я имею неадекватное представление о MySQL?
3) :) Эти вопросы добавили мой юзверы и тогда я был лохом в php, даже не проверял уже добавлен такой вопрос+ответ или нет, а вот сейчас мучаюсь и исправляю свой ошыбки :)

-~{}~ 15.03.09 04:43:

P.S. Не согласен. Если думаешь что теоретически так будет быстрее - нужно делать так. А то когда хостер выкинет или лишишся работы, тогда уже поздно будет оптимизировать :) Но как говорится, лучше поздно чем ещё позднее :)
 

x-yuri

Новичок
1) твое мнение?

3) подожди, я думал, что это тест какой-то, т.е. у одного вопроса несколько ответов. Я ошибался?

p.s. я придерживаюсь точки зрения Д. Кнута ("Преждевременная оптимизация - корень всех зол") и не только (http://en.wikipedia.org/wiki/Unix_philosophy). А ты?
Кроме того, есть такие выражения как "экономить на спичках" и bottle neck (узкое место). Еще, глянь, например, этот топик
А здесь можешь посмотреть мнения людей по поводу нормальной длительности выполнения скрипта
Поэтому если думаешь, что теоретически так будет быстрее - сравни практически. Если пользователь заметит разницу - оптимизируй
 

LONGMAN

Dark Side of the Moon..
1) Думаю да. Даже не представляю только с GROUP BY как можно обоитись. Но ума не прилажу как выбрать с помошью HAVING COUNT все записи которые удовлетворяют "выражению" DISTINCT(`answer`). Думаю это минус MySQL что нельзя выполнить запрос типа SELECT DISTINCT(`answer`),question FROM table
3) Да, ошибался. У одного вопроса один ответ. Ведь я выще привёл структуру таблицы.
P.S. На счёт преждевременной оптимизации, ну как сказать, я думаю нужно не "преждевременно оптимизировать", а изначально много думать и старатся написать оптимальный код. Потом это уже станет привычкой. Прочитал те топики, конешно в каждую строку открыть/закрыть коннект с БД это ананизм а не оптимизация :) Но на счёт других метод оптимизации (на пример ' место ", sizeof место count, вынесение переменных из скобок и т.д.), думаю это хороший стиль, имхо лучше научится писать так не из за выигришь в времени (как ты заметил это экономия на спичках), а просто для хорошего стиля и эстетики. Может я мазохист, но на пример я не могу написать в одной строке echo, в другом print, в одной строке $a = 5; в другом $а=5; ...
 

x-yuri

Новичок
1) если не знашь, читай Обобщение Данных с помощью Агрегатных Функций

Да, ошибался. У одного вопроса один ответ
тогда сорри, разбивать на 2 таблицы не нужно

Но на счёт других метод оптимизации (на пример ' место ", sizeof место count, вынесение переменных из скобок и т.д.), думаю это хороший стиль, имхо лучше научится писать так не из за выигришь в времени (как ты заметил это экономия на спичках), а просто для хорошего стиля и эстетики. Может я мазохист, но на пример я не могу написать в одной строке echo, в другом print, в одной строке $a = 5; в другом $а=5; ...
в общем-то есть еще такая штука как преждевременная пессимизация. Но откуда ты взял, что sizeof лучше count? http://www.andreas-glaser.com/2008/08/19/php-count-vs-sizeof/ и http://ua.php.net/manual/en/function.sizeof.php (sizeof - псевдноим count)
По теме еще будет вступление статьи Как заставить неправильный код выглядеть неправильно

По поводу нормализации: она позволяет уменьшить дублирование (избыточность) информации и вероятность нарушения целостности данных. Это имеет смысл ;-) (в твоем случае все ок в этом плане)
 

zerkms

TDD infected
Команда форума
LONGMAN
никогда больше не ссылайся на этот документ, его написал идиот для идиотов.
 

antson

Новичок
Партнер клуба
LONGMAN
как в квн получается ;)

роман горького - мать
часть компьютера - мать
близкий родственик - мать
что у пирата на плече - пингвин

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