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

Форум MySQL

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

 

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

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

тема: DISTINCT по выбранным полям
 
 автор: Sturmvogel   (12.02.2012 в 20:42)   письмо автору
 
 

У меня есть база товаров + к ним идет JOIN с таблицей картинок к этим товаром.
Мне их нужно вывести неповторяющимися, с картинками. DISTINCT не проходит, потому что товар один и тот же, но у него может быть несколько картинок, поэтому DISTINCT и отпал...

$sql = "SELECT DISTINCT a.*, ct.cityname as cityname, UNIX_TIMESTAMP(a.timestamp) AS timestamp, UNIX_TIMESTAMP(a.createdon) AS createdon, UNIX_TIMESTAMP(a.expireson) AS expireson,p.picfile as picfile,cat.catid,cat.catname as catname,scat.subcatname as subcatname, UNIX_TIMESTAMP(feat.featuredtill) AS featuredtill $xfieldsql
            FROM $t_ads a    
                INNER JOIN $t_subcats scat ON scat.subcatid = a.subcatid
                INNER JOIN $t_cats cat ON scat.catid = cat.catid
                    INNER JOIN $t_cities ct ON a.cityid = ct.cityid
                LEFT OUTER JOIN $t_adpics p ON a.adid = p.adid AND p.isevent = '0'
                LEFT OUTER JOIN $t_adxfields axf ON a.adid = axf.adid
                LEFT OUTER JOIN $t_featured feat ON a.adid = feat.adid AND feat.adtype = 'A'
            WHERE a.subcatid = $subcatid 
                AND a.cityid = $cityid 
                AND $visibility_condn_admin 
                AND a.adid != ".$_GET['adid']." 
                ".$similar_jobs_where."
                ".$similar_jobs_order."
                LIMIT ".constant("SIMILAR_JOBS_LIMIT");


картинки - это picfile, строки выдаются одинаковые (товары), только картинки разные.

  Ответить  
 
 автор: Sturmvogel   (12.02.2012 в 21:02)   письмо автору
 
   для: Sturmvogel   (12.02.2012 в 20:42)
 

Поэтому по сути нужен запрос, который бы не учитывал это поле picfile в DISTINCT, но добавляло в результат запроса.

  Ответить  
 
 автор: cheops   (12.02.2012 в 21:38)   письмо автору
 
   для: Sturmvogel   (12.02.2012 в 20:42)
 

>DISTINCT не проходит, потому что товар один и тот же, но у него может быть несколько картинок,
>поэтому DISTINCT и отпал...
А GROUP BY? Как раз вроде по нему задача?

  Ответить  
 
 автор: Sturmvogel   (12.02.2012 в 21:44)   письмо автору
 
   для: cheops   (12.02.2012 в 21:38)
 

Запрос

$sql = "SELECT a.*, ct.cityname as cityname, UNIX_TIMESTAMP(a.timestamp) AS timestamp, UNIX_TIMESTAMP(a.createdon) AS createdon, UNIX_TIMESTAMP(a.expireson) AS expireson,p.picfile as picfile,cat.catid,cat.catname as catname,scat.subcatname as subcatname, UNIX_TIMESTAMP(feat.featuredtill) AS featuredtill $xfieldsql
            FROM $t_ads a     
                INNER JOIN $t_subcats scat ON scat.subcatid = a.subcatid 
                INNER JOIN $t_cats cat ON scat.catid = cat.catid 
                    INNER JOIN $t_cities ct ON a.cityid = ct.cityid 
                LEFT OUTER JOIN $t_adpics p ON a.adid = p.adid AND p.isevent = '0' 
                LEFT OUTER JOIN $t_adxfields axf ON a.adid = axf.adid 
                LEFT OUTER JOIN $t_featured feat ON a.adid = feat.adid AND feat.adtype = 'A' 
            WHERE a.subcatid = $subcatid  
                AND a.cityid = $cityid  
                AND $visibility_condn_admin  
                AND a.adid != ".$_GET['adid']."  
                ".$similar_jobs_where." 
                ".$similar_jobs_order." 
             GROUP BY a.adid
                LIMIT ".constant("SIMILAR_JOBS_LIMIT");


не проходит вовсе.

  Ответить  
 
 автор: cheops   (12.02.2012 в 21:46)   письмо автору
 
   для: Sturmvogel   (12.02.2012 в 21:44)
 

Таблица a ($t_ads) - это кто? Товары или картинки?

  Ответить  
 
 автор: Sturmvogel   (12.02.2012 в 22:01)   письмо автору
 
   для: cheops   (12.02.2012 в 21:46)
 

товары. Картинки - это $t_adpics. И они участвуют в SELECT как p.picfiles

  Ответить  
 
 автор: cheops   (12.02.2012 в 22:02)   письмо автору
 
   для: Sturmvogel   (12.02.2012 в 22:01)
 

По картинкам бы и нужно группировать, товаров всегда меньше чем картинок, поэтому вы будете получать только их часть. А вот если сгруппируете по картинкам, отсортировав по двум полям "товар, картинка", тогда вы должны получить все картинки.

  Ответить  
 
 автор: Sturmvogel   (12.02.2012 в 22:04)   письмо автору
 
   для: cheops   (12.02.2012 в 22:02)
 

Мне нужно, чтобы товары не повторялись, а картинка бралась какая-то из таблицы с картинками, неважно какая. Но еще раз повторюсь, главное, чтобы товары не повторялись, а картинка может быть любая, связанная с этим товаром

  Ответить  
 
 автор: cheops   (12.02.2012 в 22:06)   письмо автору
 
   для: Sturmvogel   (12.02.2012 в 22:04)
 

Хм... тогда у вас сейчас должна идти первая картинка? Если не сложно опишите, что в выводе не так (у нас его перед глазами нет, сложно сориентироваться).

  Ответить  
 
 автор: Sturmvogel   (12.02.2012 в 22:10)   письмо автору
16.4 Кб
 
   для: cheops   (12.02.2012 в 22:06)
 

Прикрепил картинку.

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

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

  Ответить  
 
 автор: cheops   (12.02.2012 в 22:05)   письмо автору
 
   для: Sturmvogel   (12.02.2012 в 22:01)
 

У вас еще проблема в том, что картинки присоединяются к товарам при помощи LEFT JOIN, т.е. количество записей всегда будет равно количеству товаров... если вам хочется этим запросом извлечь все картинки, то следует к ним присоединять товары, т.е. либо RIGHT JOIN использовать, либо таблицу картинок поместить слева от LEFT JOIN, а таблицу товаров справа.

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

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