Выберите одну строку без повторяющихся записей - PullRequest
16 голосов
/ 12 августа 2011

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

Id, имя, город, дата, статус

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

$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 раз.
Я хочу повторить только один раз.Это возможно?

Ответы [ 8 ]

37 голосов
/ 12 августа 2011

Все довольно просто:

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

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

14 голосов
/ 12 августа 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

Я думаю, что первоеодин из них более интуитивно понятен, и между двумя

EDIT

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

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

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

6 голосов
/ 12 августа 2011

Изменить

SELECT name FROM info WHERE status = 1 ORDER BY id

на

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
2 голосов
/ 12 августа 2011

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

1 голос
/ 20 ноября 2016

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

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

РЕДАКТИРОВАТЬ: Важно отметить, что когда вам нужно больше, чем один столбец, а значения уникальны для каждой строки, тогда DISTINCT не помог.

0 голосов
/ 15 июня 2017

$ sql = "SELECT DISTINCT name FROM status = 1 GROUP BY name ORDER BY name";

$query = mysqli_query($conn,$sql);
<?php while ( $fire=mysqli_fetch_array($query)) { ?>
<h4><?php echo $query['name']; ?><br></h4>
<?php } ?>
0 голосов
/ 27 февраля 2013

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

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++;
}       
0 голосов
/ 12 августа 2011

использование Имя группы заявление

$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>';
                }
...