Сортировка по алфавиту с JOIN'ом не работает

V2oD2o
Дата: 03.02.2013 09:37:53
SELECT DISTINCT `model_name`,`model`.`vendor_id`,`vendor`.`vendor_id`,`vendor_name`
FROM `model` JOIN `vendor`
WHERE `model`.`vendor_id` = `vendor`.`vendor_id` AND `model`.`model_id`='851'
ORDER BY `vendor`.`vendor_name`


Вываливает:
Michelin Energy Saver 195/65 R15
Continental Conti4x4Contact 195/65 R15
Continental ContiEcoContact 3 195/65 R15
Barum Bravuris 195/65 R15
Barum Bravuris 2 195/65 R15
Dunlop Digi-Tyre Eco EC201 195/65 R15
Dunlop Graspic DS3 195/65 R15

т.е. с группировкой, но без алфавитной сортировки..
tanglir
Дата: 03.02.2013 09:51:58
V2oD2o,

а что вам не нравится? сортируется по последнему столбцу, а он у вас во всех записях результата один и тот же.
V2oD2o
Дата: 03.02.2013 09:57:14
последнее это не столбец, а разборка ранее созданного массива:

//$tyre=массив.

$tyre=explode("|", $val);
$query="SELECT DISTINCT `model_name`,`model`.`vendor_id`,`vendor`.`vendor_id`,`vendor_name` FROM `model` JOIN `vendor` WHERE `model`.`vendor_id` = `vendor`.`vendor_id` AND `model`.`model_id`='".$tyre[0]."' ORDER BY `vendor`.`vendor_name`";
$sql=mysql_query($query) or die(mysql_error());
while ($row=mysql_fetch_assoc($sql)) {
	echo $row['vendor_name']." ".$row['model_name']." ".$tyre[1]."/".$tyre[2]." R".$tyre[3]."<br>";
}
V2oD2o
Дата: 03.02.2013 12:26:15
Начитался, все оказалось просто:

$query="SELECT DISTINCT `model_size`.`model_id`,
	`model_size`.`size_width`,
	`model_size`.`size_profile`,
	`model_size`.`size_radius`,
	`model`.`season_id`,
	`model`.`model_name` AS MODELNAME,
	`vendor`.`vendor_name` AS VENDORNAME
FROM `model_size` 
	INNER JOIN `model` ON `model`.`model_id`=`model_size`.`model_id`
	INNER JOIN `vendor` ON `model`.`vendor_id`=`vendor`.`vendor_id`
WHERE `model_size`.`size_width`='".$params[0]."' 
	AND `model_size`.`size_profile`='".$params[1]."' 
	AND `model_size`.`size_radius`='".str_replace("R", "", $params[2])."' ".$type." 
GROUP BY VENDORNAME";


з.ы. все логично, что ничего не сортировалось)
Добрый Э - Эх
Дата: 03.02.2013 12:39:34
V2oD2o
Начитался, все оказалось просто:

$query="SELECT DISTINCT `model_size`.`model_id`,
	`model_size`.`size_width`,
	`model_size`.`size_profile`,
	`model_size`.`size_radius`,
	`model`.`season_id`,
	`model`.`model_name` AS MODELNAME,
	`vendor`.`vendor_name` AS VENDORNAME
FROM `model_size` 
	INNER JOIN `model` ON `model`.`model_id`=`model_size`.`model_id`
	INNER JOIN `vendor` ON `model`.`vendor_id`=`vendor`.`vendor_id`
WHERE `model_size`.`size_width`='".$params[0]."' 
	AND `model_size`.`size_profile`='".$params[1]."' 
	AND `model_size`.`size_radius`='".str_replace("R", "", $params[2])."' ".$type." 
GROUP BY VENDORNAME";


з.ы. все логично, что ничего не сортировалось)


Это - пять! Нужно сохранить пост и показывать потомкам, как делать точно НЕ НАДО!
Во-первых, если делаешь группировку и поле группировку включено в итоговую выборку, то дистинкт уже как бы лишний, ибо группировка в аккурат все дубли агрегирует до уникального дата-сета.
Во-вторых, хоть синтаксис MySQL и позволяет группировать по одному полю, не помещая остальные поля из SELECT в агрегатные функции или в GROUP BY, но делать все же настоятельно не рекомендуется.
В-третьих, за СОРТИРОВКУ результата запроса отвечает предложение ORDER BY, а не GROUP BY. И если в нынешней выерсии группировка делается посредством sorgt-group-by-метода, то это ни дает никаких гарантий, что в последующих версиях будет также. А то вот решат разработчики заюзать более продуктивный и менее накладный метод hash-group-by - и прощай сортировка в этом случае.
V2oD2o
Дата: 03.02.2013 12:42:53
Если чуть выше посмотреть то можно увидеть что я, можно сказать, только что научился работать с JOIN'ом, поэтому прошу не ругаться, а вышенаписанное - приму к сведению, спасибо :)
V2oD2o
Дата: 03.02.2013 12:44:17
И кстати в международной БД - tecdoc (~50гб, миллиарды позиций), в качестве сортировки используется "group by"
V2oD2o
Дата: 03.02.2013 12:46:09
Оппа - и DISTINCT там же в одном запросе с GROUP..

		SELECT DISTINCT
			IF (art_lookup.ARL_KIND IN (3, 4), brands.BRA_BRAND, suppliers.SUP_BRAND) AS BRAND,
			art_lookup.ARL_SEARCH_NUMBER AS NUMBER,
			art_lookup.ARL_KIND,
			art_lookup.ARL_ART_ID,
			des_texts.TEX_TEXT AS ART_COMPLETE_DES_TEXT
		FROM
				   art_lookup
			 LEFT JOIN brands ON brands.BRA_ID = art_lookup.ARL_BRA_ID
			INNER JOIN articles ON articles.ART_ID = art_lookup.ARL_ART_ID
			INNER JOIN suppliers ON suppliers.SUP_ID = articles.ART_SUP_ID
			INNER JOIN designations ON designations.DES_ID = articles.ART_COMPLETE_DES_ID
			INNER JOIN des_texts ON des_texts.TEX_ID = designations.DES_TEX_ID
		WHERE
			art_lookup.ARL_SEARCH_NUMBER = '".$data[0]."' AND
			art_lookup.ARL_KIND IN (1, 2, 3, 4) AND
			designations.DES_LNG_ID = 16
		GROUP BY
			BRAND,
			NUMBER;



данный скрипт используется глобально и международно :)
V2oD2o
Дата: 03.02.2013 12:51:11
все, понял разницу) групп, он и есть групп)
miksoft
Дата: 03.02.2013 13:09:30
Добрый Э - Эх
В-третьих, за СОРТИРОВКУ результата запроса отвечает предложение ORDER BY, а не GROUP BY. И если в нынешней выерсии группировка делается посредством sorgt-group-by-метода, то это ни дает никаких гарантий, что в последующих версиях будет также. А то вот решат разработчики заюзать более продуктивный и менее накладный метод hash-group-by - и прощай сортировка в этом случае.
По крайней мере, в уже вышедших версиях MySQL GROUP BY гарантирует сортировку наравне с ORDER BY.
http://dev.mysql.com/doc/refman/5.5/en/select.html
If you use GROUP BY, output rows are sorted according to the GROUP BY columns as if you had an ORDER BY for the same columns.