Как сделать запрос в базу? (дубли в array()..)

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО
#1 8 июня 2012 в 17:53
Привет всем инстантовцам!

Столкнулся с проблемой, не получается никак решить, помогите разобраться плз...
Есть запросы в базу :

  1.  
  2. $sql = "SELECT pole AS param1 FROM table1 WHERE published = 1 GROUP BY param1 ";
  3. $result = $inDB->query($sql) ;
  4. if ($inDB->num_rows($result)){
  5. while($arr = $inDB->fetch_assoc($result)){
  6. $array[] = $arr;}
  7. }
  8.  
и

  1.  
  2. $sql = "SELECT param1 FROM table2 WHERE published = 1 OR ... GROUP BY param1 ";
  3. $result = $inDB->query($sql) ;
  4. if ($inDB->num_rows($result)){
  5. while($arr = $inDB->fetch_assoc($result)){
  6. $array[] = $arr;}
  7. }
  8.  
после запросов есть массив $array,
но в нем присутствуют повторения! Вот их то и не получается никак убрать…
пробовал например так:
$array = array_unique($array); — не получилось,
пробовал до этого переворачивать $array = array_flip ($array);, тоже не выходит ..

Сейчас массив создается, и выглядит так :
Array ([0] => Array ([param1] => запись) [1] => Array ([param1] => запись) [2] => Array ([param1] => запись))
почему же array_unique не хочет работать?

Пробовал вытягивать с базы данные в одном запросе, но тогда WHERE и GROUP не так работает как мне надо ..
Или я скорее всего запрос не правильно делал ..
А возможно вообще нагородил тут непонятно чего… scratch
#2 8 июня 2012 в 19:05
KS, попробуйте после SELECT добавить слово DISTINCT
это избавит от повторов в результатах поиска
#3 8 июня 2012 в 19:07
  1. $sql = "SELECT DISTINCT pole AS param1 FROM table1 WHERE published = 1 GROUP BY param1 ";
  2. $sql = "SELECT DISTINCT param1 FROM table2 WHERE published = 1 OR ... GROUP BY param1 ";
  3.  
вот так
#4 8 июня 2012 в 19:18
может всё же сделать одним запросом? что там хранится в таблицах, они как-то взаимосвязаны? DISTINCT тоже не поможет, если в разных таблицах есть повторяющиеся значения. А array_unique() не работает потому что значение элемента сам ассоциативный массив. В нынешнем виде можно использовать, если привести к виду Array ([0]=>запись1[1]=>запись2[2]=>запись3), ключи то одинаковые 'param1'. Тогда можно использовать array_unique().
Или вообще перебираем массив, в цикле заносим в массив unic(), плюс при каждой итерации проверяем нет ли этого значения в массиве unic(), если есть то значение не заносим. Можно так. Тогда в массиве unic() будут только уникальные значения.
#5 9 июня 2012 в 03:24

KS, попробуйте после SELECT добавить слово DISTINCT это избавит от повторов в результатах поиска

SJen

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

а в одном запросе и Group справляется с задачей…
#6 9 июня 2012 в 03:28

([0]=>запись1[1]=>запись2[2]=>запись3)

Марат


Получается мне нужен одномерный обычный массив?
#7 9 июня 2012 в 06:30
Марат, А возможно сделать этот цикл как то так, что бы создавался простой массив, без лишних вложений?
while($arr = $inDB->fetch_assoc($result)){
$array[] = $arr;}


SJen, Может есть способ объединить запросы в один?
Я пробовал, сделал не понять что…, сработало, но DISTINCT обрабатывал все равно каждую таблицу по отдельности ,
и WHERE и GROUP отказались работать сразу на две таблицы с одним условием..


Мне бы или в запросе или сам массив поправить, и то и то подойдет…
#8 9 июня 2012 в 08:27

А возможно сделать этот цикл как то так, что бы создавался простой массив, без лишних вложений?

KS
Вполне. С массивом можем делать всё, что нужно. Например, так
  1.  
  2. $res_array = array();
  3. foreach($array as $value){
  4. $res_array[] = $value['param1'];
  5. }
  6. $res_array = array_unique($res_array);
  7.  
Примерно так. Может где-то ошибся. Посмотрите. Главное- суть. Тут $array — это массив, полученный после двух запросов в БД.
#9 9 июня 2012 в 08:32

Примерно так. Может где-то ошибся. Посмотрите. Главное- суть. Тут $array — это массив, полученный после двух запросов в БД.

Марат

Понял, Спасибо!
Скоро попробую, отпишусь !)
#10 9 июня 2012 в 13:31
один запрос, без дубликатов

  1.  
  2. SELECT t1.param1 as pole
  3. FROM table1 as t1
  4. WHERE published = 1
  5. UNION SELECT t2.param1 as pole
  6. FROM table2 as t2
  7. WHERE published = 1 OR 1=1
  8. GROUP BY pole
  9.  
#11 9 июня 2012 в 14:06
Все сработало!

Спасибо Марат, Администратор, SJen .
оба решения Марата и Администратора работают !

Для поиска, вдруг кому понадобится :

Рабочие решения:

Переделка двумерного массива в одномерный.

SQL запрос из двух таблиц, со слиянием без дублирующихся записей

SQL запрос из 2-х таблиц с удалением повторений


очень полезные вещи для новичков))…
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.