Выберите одну строку без повторяющихся записей

В таблице mysql info у меня есть:

Идентификатор, имя, город, дата, статус

Я хочу выбрать все имена из "информации" Создание запроса

$query = mysql_query("SELECT name FROM info WHERE status = 1 ORDER BY id") 
         or die(mysql_error());

while ($raw = mysql_fetch_array($query)) 
{
  $name = $raw["name"];
  echo ''.$name.'<br>';
}

Ну, в результате он возвращает все записи. Я хочу повторить все записи без дубликатов.

Говоря: под необработанным «именем» мы вставили имя «Джон» 10 раз.
Я хочу повторить только один раз. Это возможно?


person Darius    schedule 12.08.2011    source источник


Ответы (8)


Это довольно просто:

SELECT DISTINCT name FROM info WHERE status = 1 ORDER BY id

Ключевое слово SQL DISTINCT делает свое дело.

person Bohemian♦    schedule 12.08.2011

попробуйте использовать это как ваш запрос:

SELECT DISTINCT name FROM info WHERE status = 1 ORDER BY id

чтобы получить разные имена

или как другое предложенное использование GROUP BY

SELECT name FROM info WHERE status = 1 GROUP BY name ORDER BY id

Я думаю, что первый более интуитивно понятен, и между ними нет большой разницы в производительности.

ИЗМЕНИТЬ

так как ОП хочет также количество имен, здесь мы идем:

SELECT name,COUNT(id) AS n_names
FROM info WHERE status = 1
GROUP BY name
ORDER BY name

вы можете ORDER BY name или n_names в зависимости от того, что вам нужно

person Dalen    schedule 12.08.2011

Изменять

SELECT name FROM info WHERE status = 1 ORDER BY id

to

SELECT name FROM info WHERE status = 1 GROUP BY name ORDER BY id

Обратите внимание, что GROUP BY было добавлено. Подробнее о группе на http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html

Изменить:
для имени с количеством появлений попробуйте

SELECT name, count(name) FROM info WHERE status = 1 GROUP BY name ORDER BY id
person cristian    schedule 12.08.2011
comment
работает, но я хочу каламбурить после имени количество записей, подобных этому code echo ''.$name.' (раз)'; - person Darius; 12.08.2011

добавьте GROUP BY name в свой SQL-статат ​​- это вернет только одну запись из каждой записи из столбца имени

person Manse    schedule 12.08.2011
comment
Когда применяется GROUP By name, занимает ли он только первую строку? если заказ по ID? - person ; 21.03.2017
comment
@YumYumYum порядок не гарантируется, если вы не добавите оператор order by - person Manse; 21.03.2017
comment
Поэтому спасибо за безопасность, я использовал этот SELECT id,duplicate_name,duplicate_email from SERVICE where duplicate_email='[email protected]' GROUP BY duplicate_email ORDER BY id, который дает мне строку, когда этот пользователь уже зарегистрировался, и в следующий раз снова войдите в этот конкретный проект. - person ; 21.03.2017

используйте оператор имени GROUP BY

$query = mysql_query("SELECT name FROM info WHERE status = 1 GROUP BY name ORDER BY id") or      die(mysql_error());

while ($raw = mysql_fetch_array($query)) {
                $name = $raw["name"];
                echo ''.$name.'<br>';
                }
person SergeS    schedule 12.08.2011

Это работает для меня, возвращает имена таблиц для данной базы данных.

my $sql="select distinct table_name from COLUMNS  where table_schema='$database'"
my $sth = $dbht->prepare( $sql )
      or die "Cannot prepare SQL statement: $DBI::errstr\n";
  $sth->execute
      or die "Cannot execute SQL statement: $DBI::errstr\n";

  if ($DBI::err){

    $msg= "Data fetching terminated early by error: $DBI::errstr";

}


while (@col=$sth->fetchrow_array()){
    $table[$i]=$col[0];
    $i++;
}       
person Darkpore    schedule 27.02.2013

Допустим, вы отправляете массовые смс и не хотите отправлять одно и то же сообщение два раза одному и тому же парню Ивану. Что я обнаружил, так это то, что одновременное использование GROUP BY и ORDER BY работает отлично. Но я не говорю, что это лучший способ. Вот как вы можете его использовать

SELECT name FROM info WHERE status = 1 GROUP BY name ORDER BY name

EDIT: Это важно отметить, когда вам нужно больше, чем один столбец, и значения уникальны для каждой строки, тогда DISTINCT не помогает.

person Humphrey    schedule 20.11.2016
comment
+1 это ПРАВИЛЬНО в моем случае. Потому что мне пришлось взять SELECT id,name,email from SIGNUP where groups='admin' Group by email ORDER by id - person ; 21.03.2017

$sql="ВЫБЕРИТЕ ОТЛИЧНОЕ имя ОТ статуса =1 СГРУППИРОВАТЬ ПО имени ПОРЯДОК ПО имени";

$query = mysqli_query($conn,$sql);
<?php while ( $fire=mysqli_fetch_array($query)) { ?>
<h4><?php echo $query['name']; ?><br></h4>
<?php } ?>
person Laud Randy Amofah    schedule 15.06.2017