Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Distinct
 
 автор: chexov   (29.08.2008 в 10:35)   письмо автору
 
 

Итак делаю запрос:

$q  = mysql_query("SELECT distinct(`pole1`), `pole2` FROM `table`;");
pole1 типа varchar(3)
pole2 типа varchar (255)

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

$q  = mysql_query("SELECT distinct(`pole1`) FROM `table`;");

Проблем не возникает
=========================================================
аналогично делая запрос

$q  = mysql_query("SELECT distinct(`pole1`), `pole2` FROM `table2`;");
pole1 типа varchar(3)
pole2 типа int (11)

Проблем не возникает
Объясните парадокс пожалуйста и как это обойти?
P.S Сразу оговорюсь что GROUP BY не подойдет в данном случае, так как я вывожу не только уникальные значения pole1 но и все значения pole2

  Ответить  
 
 автор: chexov   (29.08.2008 в 19:46)   письмо автору
 
   для: chexov   (29.08.2008 в 10:35)
 

Какие соображения?

  Ответить  
 
 автор: Trianon   (29.08.2008 в 19:54)   письмо автору
 
   для: chexov   (29.08.2008 в 19:46)
 

спецификатор DISTINCT обеспечивает уникальность строк результата, а вовсе не отдельных полей.
Да и как бы ему иначе-то?

А что Вы хотите получить - непонятно.
к примеру в таблице
p1 p2 
 1  1
 1  2
 2  1 
 2  2

какой ожидается результат и почему?

  Ответить  
 
 автор: cheops   (29.08.2008 в 22:12)   письмо автору
 
   для: chexov   (29.08.2008 в 19:46)
 

Вы обязательно DISTINCT хотите воспользоваться? GROUP BY не подойдет?

  Ответить  
 
 автор: AcidTrash   (30.08.2008 в 00:00)   письмо автору
 
   для: chexov   (29.08.2008 в 10:35)
 

>так как я вывожу не только уникальные значения pole1 но и все значения pole2
Вы сами хоть, понимаете, что хотите?

  Ответить  
 
 автор: chexov   (31.08.2008 в 07:49)   письмо автору
 
   для: AcidTrash   (30.08.2008 в 00:00)
 

абсолютно! объясняю подробнее: в таблице хранятся данные о пользователе, Pole1 содержит номера групп, а pole 2 содержит имена пользоваетелей(неповторяемые), так вот под одним номером группы может быть сколько угодно пользователей, поэтому и надо группы выводить уникальные, а пользователей всех подряд
===================================

pole 1      pole2

1           user1
1           user2
2           user3
3           user4
4           user5
4           user6

  Ответить  
 
 автор: Trianon   (31.08.2008 в 11:46)   письмо автору
 
   для: chexov   (31.08.2008 в 07:49)
 

Вы не показали, каким должен быть вывод.

  Ответить  
 
 автор: chexov   (31.08.2008 в 13:33)   письмо автору
 
   для: Trianon   (31.08.2008 в 11:46)
 



        - user1
группа 1- user2

группа2 - user3

группа3 - user4 

        -user5
группа4 -user6

примерно так

  Ответить  
 
 автор: Trianon   (31.08.2008 в 13:43)   письмо автору
 
   для: chexov   (31.08.2008 в 13:33)
 

почему тогда не так:


группа 1- user1
        - user2

группа2 - user3

группа3 - user4 

группа4 -user5
        -user6

?

Вопрос надо читать как "где в таблицах присутствует информация, указывающая, что один ответ верен, а другой - нет?"

И поскольку оба ответа равновозможны - чистым SQL Вашу задачу не решить.
SQL - (в большинстве ситуаций) язык запросов с детерминированным результатом, а не абы каким.

А для решения на уровне php вполне достаточно того вывода, что Вы привели в (31.08.2008 в 07:49)

  Ответить  
 
 автор: Trianon   (31.08.2008 в 13:48)   письмо автору
 
   для: Trianon   (31.08.2008 в 13:43)
 

Есть, правда, вариант запроса, который вернет

1 | user1,user2
2 | user3
3 | user4 
4 | user5,user6

Это агрегирующий запрос с применением функции GROUP_CONCAT()
Но у него есть недостаток... С большими объемами данных такой запрос справляется без гарантий.
Так что лучше всё же через php.

  Ответить  
 
 автор: chexov   (31.08.2008 в 18:10)   письмо автору
 
   для: Trianon   (31.08.2008 в 13:48)
 

Подскажите как через GROUP_CONCAT() и как через php если можно наглядно

  Ответить  
 
 автор: Trianon   (31.08.2008 в 18:32)   письмо автору
 
   для: chexov   (31.08.2008 в 18:10)
 

SELECT pole1, GROUP_CONCAT(pole2 ORDER BY pole SEPARATOR ',') 
  FROM tbl 
  GROUP BY pole1


Что до php - показывайте код, который выведет (31.08.2008 в 07:49) - а там скорректируем.

  Ответить  
 
 автор: chexov   (31.08.2008 в 18:56)   письмо автору
 
   для: Trianon   (31.08.2008 в 18:32)
 


<?php

$q  
mysql_query("SELECT distinct(`pole1`), `pole2` FROM `table`;");
while (
$arr mysql_fetch_assoc($q))
  {
  echo 
"
    <ul> 
      <li>'.
$arr['pole1'].' группа
       <ul> 
        <li> "
.$arr['pole2']."</li> 
       </ul> 
      </li>
    </ul>"
;
  }
?>

что то типа того

  Ответить  
 
 автор: Trianon   (31.08.2008 в 19:18)   письмо автору
 
   для: chexov   (31.08.2008 в 18:56)
 

<?php

$q  
mysql_query("SELECT `pole1`, `pole2` FROM `table` ORDER BY pole1, pole2 ");
$curr false;
  echo 
"<ul>";
while (
$arr mysql_fetch_assoc($q))
  {
    
$pole1 htmlspecialchars($arr['pole1']);
    
$pole2 htmlspecialchars($arr['pole2']);
    if(
$curr !== $pole1)
    {
      if(
$curr !== false)
        echo 
"</ul></li>\r\n"
      echo 
"<li>$pole1<ul>"
      
$curr $pole1;
    }
    echo 
"<li>$pole2</li>\r\n"
  }
  if(
$curr !== false)
        echo 
"</ul></li>"
  echo 
"</ul>\r\n"

?> 

  Ответить  
 
 автор: chexov   (31.08.2008 в 18:58)   письмо автору
 
   для: Trianon   (31.08.2008 в 18:32)
 


ORDER BY pole SEPARATOR ','

по какому полю сортируем? по 1 или 2 и что такое ',' ?

  Ответить  
 
 автор: Trianon   (31.08.2008 в 19:20)   письмо автору
 
   для: chexov   (31.08.2008 в 18:58)
 

pole2
разделитель списка

  Ответить  
 
 автор: chexov   (01.09.2008 в 06:20)   письмо автору
 
   для: Trianon   (31.08.2008 в 19:20)
 

PHP средствами все работает отлично! Спасибо огромное!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования