[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: DISTINCT ?!
noo
Столкнулся с такой проблемой - нужно выбрать все данные с уникальным именем:

SELECT DISTINCT(name), fam, id FROM table - вот такой запрос не выдает уникальных по столбцу name строк

SELECT DISTINCT(name) FROM table - выдает, но нужно как-то получить и остальные данные.

Как это делается?




Спустя 12 минут, 18 секунд (4.07.2010 - 18:13) sergeiss написал(а):
БД какая? MySQL?

И вопрос не совсем понятен: "нужно выбрать все данные с уникальным именем".
Вот есть у тебя таблица, а в ней 3 записи с именем "Вася".
Ты хочешь, чтобы данные в выбранной строке были от одного Васи? Или чтобы было показано один раз "Вася", а данные были бы все от 3-х записей?
Что ты имел ввиду?

Спустя 17 минут, 17 секунд (4.07.2010 - 18:30) Nord написал(а):
Можно так:

SELECT name, fam, id FROM table GROUP BY name

Спустя 43 секунды (4.07.2010 - 18:31) noo написал(а):
mysql, 2 вариант:
Цитата
чтобы было показано один раз "Вася", а данные были бы все от 3-х записей

=========
если совсем подробно, то нужно вывести вася, а затем по id всех остальных вась, влючая этого самого, собрать информацию из других таблицы.

Спустя 2 минуты, 2 секунды (4.07.2010 - 18:33) sergeiss написал(а):
Цитата (noo @ 4.07.2010 - 19:31)
mysql, 2 вариант:

Тогда тебе придется все равно выбирать все записи, только сортировать их сначала по имени, а потом уже по любому другому параметру. Тогда все записи с именем "Вася" будут идти подряд, все записи с именем "Серёга" будут идти также подряд, где-то уже после всех Васей smile.gif
И при выборке данных ты их сам должен будешь обработать.

Типа такого:
SELECT name, fam, id FROM table ORDER BY name, fam

Спустя 5 минут, 31 секунда (4.07.2010 - 18:39) noo написал(а):
Цитата (sergeiss @ 4.07.2010 - 15:33)
Цитата (noo @ 4.07.2010 - 19:31)
mysql, 2 вариант:

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

Да это понятно, но то, что нужно чуть выше в отредактированном сообщении.

Пока у меня такой вариант складывается - получить данные с GROUP BY name
и собрать их id'шки в массив. А затем пробежаться по массиву. Вот только такой путь мне изначально казался каким-то извращенным, поэтому и ищу более красивого решения еще на стадии выборки данных из таблицы.

Спустя 1 минута, 55 секунд (4.07.2010 - 18:41) sergeiss написал(а):
Я тебя не понимаю совсем... Даже если ты сделаешь так, как описал "получить данные с GROUP BY name и собрать их id'шки в массив. А затем пробежаться по массиву.", то ты получишь то же, то написал я, только в более извратном виде, с кучей промежуточного кода на ПХП, вместо того, чтобы сделать всё одним простым запросом к БД.
Где тут здравый смысл, я не пойму никак?

PS. Если "из других таблиц", то это уже другой вопрос совсем. Про это изначально не было сказано.

Спустя 14 минут, 28 секунд (4.07.2010 - 18:55) noo написал(а):
дык объясню:

есть такое дело

имена
1 петя
2 вася
3 федя
4 вася
5 федя

есть вторая таблица:
характеристики:

ид ид_имен хар-ка
1 1 молодец
2 2 молодец
3 1 классный парень
4 4 работяга

Что нужно выводить:
петя - молодец, классный парень
вася - молодец, работяга
федя - нет данных о феде

Это все так, пример, на самом деле ни разу не имена, поэтому нам не важно какой вася или петя.


Спустя 10 минут, 51 секунда (4.07.2010 - 19:06) waldicom написал(а):
select * from `characteristic` where `id_name` in (select `id` from `names` wehre `name` = 'Вася' group by `name`)

типа такого?

Спустя 9 минут, 17 секунд (4.07.2010 - 19:15) noo написал(а):
waldicom, при этом запросе данные из characteristic мы-то получим, а вот Вася не выведем.

Спустя 26 минут, 3 секунды (4.07.2010 - 19:41) Ice написал(а):
Дамп:

CREATE TABLE `names` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`name` TEXT NULL,
PRIMARY KEY (`id`)
)

ENGINE=InnoDB


CREATE TABLE `chars` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`nid` INT(10) NULL DEFAULT NULL,
`chaR` TEXT NULL,
PRIMARY KEY (`id`)
)

ENGINE=InnoDB


запрос

SELECT name, `char` FROM `names` n LEFT JOIN chars c ON c.nid=n.id


Выведет:

Вася работяга
Вася классный парень
Петя фуфлыжник
Федя NULL

Спустя 3 минуты, 51 секунда (4.07.2010 - 19:45) noo написал(а):
Очень приятно, что столько людей откликнулись и решили помочь.. но пожалуйста, читайте тему.

Нужно 1 раз выводить вася, даже если их тысяча.
После же надо выводить все характеристики всех вась. и все в цикле, потому что кроме вась еще могут быть пети и другие smile.gif

Спустя 1 минута, 34 секунды (4.07.2010 - 19:47) Ice написал(а):
А привлечь РНР для этих целей не то?

Спустя 4 минуты, 48 секунд (4.07.2010 - 19:51) noo написал(а):
ну смотрите, единственный вариант, который я пока вижу.
Собрать всех по отдельности в массив по запросу:
SELECT name, id FROM table GROUP BY name
$name[]=$..['name']


затем циклом foreach пробежаться по $name, каждый раз делая запрос к бд через FROM table LIKE $name
получить все id для каждого name
и потом уже из второй таблицы по этим id перебирать.

Но, тут кода до жопы, а я надеялся, что есть способ попроще.

Спустя 8 минут, 20 секунд (4.07.2010 - 20:00) waldicom написал(а):
Одним SQL-запросом врядли такое можно выполнить. PHP в руки и вперед.

Спустя 1 минута, 8 секунд (4.07.2010 - 20:01) Basili4 написал(а):
ИМХО Есть вариант проще выбрать всех Васей и Петей в один запрос с сотрировкой по именам и в при отображении не показывать первый столбец ну тоесть Вась и Петь если если значение из этого поля равно предыдущему значению из этого же поля

Спустя 10 минут, 23 секунды (4.07.2010 - 20:11) noo написал(а):
Цитата (Basili4 @ 4.07.2010 - 17:01)
ИМХО Есть вариант проще выбрать всех Васей и Петей в один запрос с сотрировкой по именам и в при отображении не показывать первый столбец ну тоесть Вась и Петь если если значение из этого поля равно предыдущему значению из этого же поля

Вариант хоорший! Только то ли я туплю, а то ли как, если все это дело происходит в цикле while, сохранять предыдущий вариант?

Спустя 2 минуты, 40 секунд (4.07.2010 - 20:14) sergeiss написал(а):
Цитата (Basili4 @ 4.07.2010 - 21:01)
ИМХО Есть вариант проще выбрать всех Васей и Петей в один запрос с сотрировкой по именам и в при отображении не показывать первый столбец ну тоесть Вась и Петь если если значение из этого поля равно предыдущему значению из этого же поля

Как раз лучше будет показать всех Вась и Петь. Я об этом варианте говорил еще на первой странице. Но ТС этот вариант "отверг".

Спустя 3 минуты, 10 секунд (4.07.2010 - 20:17) sergeiss написал(а):
Кстати... Есть возможность выбрать всё одним запросом, только надо еще и функцию сделать дополнительную.
Тогда запрос будет типа такого:
select `name`, get_params( `name` ) from your_table group by `name`

(насчет GROUP BY я не уверен, т.к. больше в Постгре работаю, а там своя специфика есть насчет группировок, и есть отличия от MySQL).
Внутри функции get_params() надо просто выбрать все параметры, относящиеся к указанному имени и вернуть их в виде строки. Например, с разделителем запятая.

Спустя 1 минута, 46 секунд (4.07.2010 - 20:19) Basili4 написал(а):

$name='';
while
{
echo('<tr>')
if ($name!=$row[0]){$name=$row[0]; echo("<td>$name</td>");}

echo('Все остальные поля</tr>');

}

Спустя 2 минуты, 58 секунд (4.07.2010 - 20:22) sergeiss написал(а):
Basili4 - while - а какое условие-то??? И опять же это совсем не то! Потому что надо выбрать из РАЗНЫХ СТРОК данные, а не просто собрать разные колонки.

Спустя 1 минута, 40 секунд (4.07.2010 - 20:23) Ice написал(а):
очень много кода?

$sql = 'select name, `char` from `names` n left join chars c on c.nid=n.id';
$q = mysql_query( $sql );

$users = array();

while( $row = mysql_fetch_array( $q, MYSQL_NUM ) ) {
settype( $users[$row['0']], 'array');
$users[$row['0']][] = $row['1'];
}
foreach( $users as $k=>$user ) {
print '<dt>'.$k.'</dt>';
foreach( $user as &$char) {
print '<dd>->'.$char.'</dd>';
}
}


Спустя 3 минуты, 15 секунд (4.07.2010 - 20:27) sergeiss написал(а):
Ice - а этот код к чему? ohmy.gif Как он коррелирует с заявленной логикой работы?

Спустя 2 минуты, 24 секунды (4.07.2010 - 20:29) Ice написал(а):
@sergeiss Если я правильно понял ТС, то этот код как раз и выведет то, что ему надо:

Вася
->работяга
->классный парень
Петя
->фуфлыжник

Спустя 6 минут, 44 секунды (4.07.2010 - 20:36) noo написал(а):
Вот это жарко тут становится.
Сейчас попробую код Ice'a.

А как вам такой вариант:

$i=0;
while($r = mysql_fetch_array(mysqlQuery("SELECT * FROM table ORDER BY name")))
{
$old_name[]=$r['name'];
$i++;
if ($old_name[$i-1]!=$r['name']) {echo $name}
//и попер код дальше выбирать характеристики всех с $name

?

Спустя 2 минуты, 59 секунд (4.07.2010 - 20:39) sergeiss написал(а):
Ice - на предыдущей странице он по-другому описал smile.gif "Работяга" и "классный парень" должны быть в одной строке. Т.е., они должны быть собраны в одну строку или в ПХП, или в самом запросе.

Я в данной ситуации буду утверждать, что автору надо сосредоточить свои усилия на создании функции в MySQL, которая будет это делать. Тогда можно будет вывести данные одним запросом.
При этом он получит, по сути дела, "цикл в цикле", т.к. внутри функции будет делаться выборка и через цикл данные будут собираться в одну строку. Но это должно работать быстрее, чем в ПХП. А в ПХП все равно будет "цикл в цикле", только работающий медленнее.
Да и вообще - я сторонник того, что надо функционал переносить в БД, когда есть такая возможность.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.