Tu consulta es así:
Respondiendo tus preguntas:
1) El orden de resolución de los AND es el mismo de aparición, normalmente, con algunas excepciones, como las subconsultas en el WHERE. Pero de todos modos la cadena de ANDs debe dar TRUE completa para que haya resultados.
Los OR anidados, por su parte, puede que se ejecuten todos o no. Como sólo se necesita uno TRUE, con el primero que se da el resto de la condición no necesita evaluarse.
2) Las eficiencia de las condiciones es relativa. Condiciones de tipo ">", "<", ">=", "<=", no suelen ser eficientes porque pueden implicar revisar la mayoría de la tabla, con lo que puede dar lugar a que descarte índices posibles y lea todo... con la consiguiente recarga de recursos.
En este tipo de casos suele ser práctico establecer índices sobre los campos del WHERE. En ocasiones la diferencia de performance es enorme.
Tips finales:
- Cuidado con el uso de palabras reservadas como nombres de campo, como es el caso de "date". No uses palabras que puedas ser nombres de función, cláusulas o tipos de dato. Te pueden generar errores indetectables.
- Cuidado con los ID: Si la tabla foros tiene un ID autonumérico, la cláusula DISTINCT no producirá ningún efecto.
- Si los campos son numéricos, no pongas los valores de las variables entre apóstrofes, eso sólo es válido para las cadenas de texto, fechas y horas. En los valores numéricos obligas al sistema a hacer una conversión implícita, que en consultas masivas afecta la performance.
Otra sintaxis:
Código MySQL:
Ver original `date` >= '$dateoneweekago' AND (campo1
IN ('$ratio1', '$ratio2', '$ratio3') OR campo2
IN('$ratio1', '$ratio2', '$ratio3'))