Да гавнокодеры есть везде, в том числе и на самом говнокоде. Также утверждение telnet'а о том что парсер будет переносить запрос из ON в WHERE это полный бред равный нулю. Здесь вопрос больше дизайна и юзабилия кода касается. Я считаю что использование JOIN намного читабильнее и правильне, интуитивно понятнее. Я не представляю как нужно будет извращаться с запросомс "запятой", когда нужно будет объединить более 2 таблиц, а если еще типы объединения разные. Я пишу запросы в приложениях, где помиомо ещенужно обращаться к справочникам для создания сложных отчетов. Например вот один не самый сложный, но очень удачный пример где человек знающий операции JOIN легко может понять суть запроса
$sql = "
SELECT
{$PRE}lab_type_research.name,
{$PRE}lab_markers.name_marker,
{$PRE}lpu.name_lpu,
{$PRE}lpu.lpu_id,
{$PRE}lab_markers_values.id_type_research,
{$PRE}lab_markers_values.marker_id,
{$PRE}lab_markers_values.`values` AS status,
count(*) AS col
FROM
{$PRE}lab_markers_values
INNER JOIN
{$PRE}lab_analyses ON {$PRE}lab_analyses.number_research = {$PRE}lab_markers_values.number_research
AND {$PRE}lab_analyses.id_type_research = {$PRE}lab_markers_values.id_type_research
AND {$PRE}lab_analyses.data BETWEEN '{$data_first}' and '{$data_second}'
{$where_lpu}
INNER JOIN
{$PRE}lab_markers ON {$PRE}lab_markers_values.marker_id = {$PRE}lab_markers.marker_id
INNER JOIN
{$PRE}lab_type_research ON {$PRE}lab_type_research.research_id = {$PRE}lab_markers_values.id_type_research
INNER JOIN
{$PRE}lpu ON {$PRE}lpu.lpu_id = {$PRE}lab_analyses.lpu_id
GROUP BY
{$PRE}lab_analyses.lpu_id,
{$PRE}lab_markers_values.id_type_research,
{$PRE}lab_markers_values.marker_id,
{$PRE}lab_markers_values.`values`
ORDER BY
{$PRE}lpu.lpu_id";