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

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

Да но при этом мне нужно выбрать все поля чтобы их значения потом перекинуть в другую таблицу, а этот выбирает только col1
выбирай все поля, в чем проблема?
 
Нет, не выдает. Короче, в этом таблице есть вопросы и ответы для викторины. То есть co1 - id auto_increment col2 - вопрос, col3 - ответ, и мне нужно что бы значение col3 не повторялось, не смотря на col1 col2.
 
т.е. у тебя есть таблица с составным ключом
A,Б,В и полями данных Д,Е,Ж,З
нужно выбрать A,Б,В,Д,Е,Ж,З такие ,чтобы
сочетание ключа было уникально, но данные были проинициализированы

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

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

-~{}~ 14.03.09 14:03:

LONGMAN
сдается что както не так спроектирована БД у Вас.
исходную задачу и чего на проектировали в студию
 
Мне нужно уникальность только одного поля. Вот структура таблицы:
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
 
1) так а какой ты из вопросов с некоторым ответом хочешь перекидывать?
2) почему не сделать 2 таблицы: вопросы, ответы?
 
1) Все вопросы где ответ не будет повторятся
2) Не вижу особого смысла
 
1) В таком случае мне нужны записи
1 Вопрос1 Ответ1
2 Вопрос1 Ответ2
2) Думаю здесь это не нужно..
 
1) по какому принципу ты выбрал "Вопрос1 Ответ1"? Первый вопрос? Любой вопрос?
2) нормальный подход к проектированию БД: нормализованная БД... а если медленно работает, то тогда уже можно подумать и об оптимизациях
3) а зачем тебе получать список ответов? Я понимаю зачем список ответов на вопрос, но ведь это не твой случай
 
1) Любой вопрос, не имеет значение.
2) Нет, медленно не работает. Зачем нормализовать таблицу где всего лишь 3 поля? ид, вопрос, ответ. Думаю здесь оптимизация лишнее
3) Потаму что мне не нужны те вопросы на которых повторяются ответы.
 
1) указывай в select_expr не только answer, но и question, только не DISTINCT, а GROUP BY
2) оптимизация - это когда все в одной таблице. И оптимизация здесь лишнее
3) что ты такое пытаешься сделать, что тебе нужен список уникальных ответов с любым из вопросов к ним?
 
1) То есть? SELECT question,answer GROUP BY answer HAVING COUNT(answer) = 1? Так я ведь делал, не подходит..
2) Оптимизация предпочтительнее для меня. То есть пройзводительность
3) Всего лишь удалить из таблицы двойники, троиники и т.д. всех ответов. Не думал что будет так проблематично :-)
 
1) нет, конечно. Подумай, что делает твой запрос и как его исправить
2) даже если разницы в производительности 2-х вариантов _не будет_?
3) интересная задача. Такое впечателние, что у тебя таблица с ответами, а вопросы - дело такое, все равно на них никто отвечать не будет ))

-~{}~ 15.03.09 02:09:

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

-~{}~ 15.03.09 04:43:

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

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

p.s. я придерживаюсь точки зрения Д. Кнута ("Преждевременная оптимизация - корень всех зол") и не только (http://en.wikipedia.org/wiki/Unix_philosophy). А ты?
Кроме того, есть такие выражения как "экономить на спичках" и bottle neck (узкое место). Еще, глянь, например, этот топик
А здесь можешь посмотреть мнения людей по поводу нормальной длительности выполнения скрипта
Поэтому если думаешь, что теоретически так будет быстрее - сравни практически. Если пользователь заметит разницу - оптимизируй
 
1) Думаю да. Даже не представляю только с GROUP BY как можно обоитись. Но ума не прилажу как выбрать с помошью HAVING COUNT все записи которые удовлетворяют "выражению" DISTINCT(`answer`). Думаю это минус MySQL что нельзя выполнить запрос типа SELECT DISTINCT(`answer`),question FROM table
3) Да, ошибался. У одного вопроса один ответ. Ведь я выще привёл структуру таблицы.
P.S. На счёт преждевременной оптимизации, ну как сказать, я думаю нужно не "преждевременно оптимизировать", а изначально много думать и старатся написать оптимальный код. Потом это уже станет привычкой. Прочитал те топики, конешно в каждую строку открыть/закрыть коннект с БД это ананизм а не оптимизация :-) Но на счёт других метод оптимизации (на пример ' место ", sizeof место count, вынесение переменных из скобок и т.д.), думаю это хороший стиль, имхо лучше научится писать так не из за выигришь в времени (как ты заметил это экономия на спичках), а просто для хорошего стиля и эстетики. Может я мазохист, но на пример я не могу написать в одной строке echo, в другом print, в одной строке $a = 5; в другом $а=5; ...
 
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)
По теме еще будет вступление статьи Как заставить неправильный код выглядеть неправильно

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

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

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