Lo que no puede estar sacando es el 102 si ese campo pertenece a la columna empresas_descuentos.id. no está claro el origen del dato, pero para el caso el problema es el funcionamiento del GROUP BY en MySQL:
Como MySQL admite usar GROUP BY sin necesidad de indicar todos los campos no afectados por funciones agregfadas (MAX() en este caso), la pregunta es qué pasa con los otros vampos no usados en él.
Simple: Devuelve el primer valor que encuentre, en el primer registro devuelto para las cindciones dadas.
Eso significa que si ese 102 pertenece a un campo distinto del afectado por el MAX(), es correcto que devuelva eso. Lo que estaría mal en todo caso sería la construcción de la tabla, ya que no deberías incluir campos que puedan tener valores diferenciales entre distintos registros.
¿Se entiende la idea?
Básicamente, mira qué pasa cuando haces esto:
Código MySQL:
Ver original ed.id_empresas,
ed.perfil,
e.id id_descuento,
e.id_empresas,
e.activo,
e.descuento,
e.limitaciones,
e.fecha_desde,
e.fecha_hasta,
m.id,
m.nombre,
m.id_categorias,
m.nombre_pc,
m.apellido1_pc,
m.email,
m.telefono,
m.cif,
em.id id_empresas,
em.id_mis_datos,
p.id_empresas
INNER JOIN empresas_direcciones ed
ON ed.id_empresas
= em.id
INNER JOIN empresas_descuentos e
ON e.id_empresas
= ed.id_empresas
e.activo = 1
-- AND e.fecha_hasta >= "2013-11-06"
ed.perfil,
e.id id_descuento,
e.id_empresas,
e.activo,
e.descuento,
e.limitaciones,
e.fecha_desde,
e.fecha_hasta,
m.id,
m.nombre,
m.id_categorias,
m.nombre_pc,
m.apellido1_pc,
m.email,
m.telefono,
m.cif,
em.id id_empresas,
em.id_mis_datos,
p.id_empresas;
Si devuelve más de un registro por cada ed.id_empresas, entonces lo que tienes es mal construida la consulta, como te digo, y deberás rediseñarla para hacerla en partes.