Bueno, un primer acercamiento podría ser:
Código MySQL:
Ver original *
`principal` `P`
`categorias` `C` ON `P`.
`id_categoria` = `C`.
`id_categoria` `C`.
`id_categoria` IN (1,2, 3, 4) AND `P`.
`premium` IN (0,1) *
`principal`
`categorias` ON `principal`.
`id_categoria` = `categorias`.
`id_categoria` `categorias`.
`IdPadre` IN (1,2, 3, 4) AND `P`.
`premium` IN (0,1)
Donde la implementación tal vez podría ser:
Código PHP:
Ver original// Caso de ejemplo
$categorias = '1, 2, 3, 4, 5, 6';
$qry =
"SELECT
*
FROM
`principal` `P`
INNER JOIN
`categorias` `C` ON `P`.`id_categoria` = `C`.`id_categoria`
WHERE
`C`.`id_categoria` IN ($categorias) AND `P`.`premium` IN (0,1)
UNION
SELECT
*
FROM
`principal`
INNER JOIN
`categorias` ON `principal`.`id_categoria` = `categorias`.`id_categoria`
WHERE
`categorias`.`IdPadre` IN ($categorias) AND `P`.`premium` IN (0,1)
ORDER BY `C`.`id_categoria` ASC, `P`.`premium` ASC, C.`id_principal` DESC;";
En esencia, las categorias a consultar deben quedar incrustadas en la query como un cojunto de valores separados por comas.
Esta consulta así como está no es totalmente correcta porque estás haciendo una de las peores formas de consultar, que es usar el asterisco ("SELECT *", sería conveniente que usarlas los campos específicos uno a uno, a fin de poder hacer dos cosas: 1) Evitar traer campos duplicados o innecesarios, y 2) De ese modo se puede hacer crear un ORDER BY correcto, con los campos por posición, de modo de poder establecer un buen formato de salida, y evitar problemas de nombres de columnas, que son probables en esta forma.