Eso de la mejor forma ya no se ... pero se me ocurre lo siguiente...
Supongamos que tenemos
Marcas
idMarca
Marca
Acronimo
(en acronimo tenemos las siglas que vamos a usar)
Productos
idProducto
Producto
idMarca
numCodigo
(en numCodigo guardamos la parte numerica del codigo "amigable")
idMarcaX=SELECT idMarca FROM marcas WHERE marca="MarcaX"
SELECT max(numCodigo)+1 FROM productos WHERE idMarca=idMarcaX
lo ideal seria poder ejecutar la segunda query dentro de un INSERT INTO en que se insertara el producto...
PERO no puedes escribir y leer al mismo tiempo en la misma tabla....creo
Lo que si es fácil es ejecutar en programación externa las dos primeras querys y construir el INSERT INTO con los valores obtenidos
$idMarcaX <--- SELECT idMarca FROM marcas WHERE marca="MarcaX"
$nuevoNumCodigo <--- SELECT IFNULL(max(numCodigo),0)+1 FROM productos WHERE idMarca=$idMarcaX
(no uses COUNT solo con MAX+1 te aseguras que nunca vas a repetir números, hay un caso si se borra el ultimo producto entrado de una marca despues de haber mostrado su codigo el siguiente producto tendrá el mismo codigo... y podrian correr listas con los dos producto y el mismo codigo)
Código MySQL:
Ver original idMarca,
numCodigo)
$id_MarcaX,
$nuevoNumCodigo;
Y finalmente con esto obtienes tu lista amigable de productos
Si se pueden hacer indices compuestos de varios campos pero no tiene nada que ver con esto, es otra guerra....
No se puede tener mas de un autoincrement en una tabla y este siempre será eso auto increment no hay manera de hacer que se reinicie en funcion de otro campo.
Para superar el caso del producto borrado podria guardar en la tabla Marcas el ultimo codigo he incrementarlo cada vez que se agregue un producto y nunca decrementarlo aún que borres productos...
Marcas
idMarca
Marca
Acronimo
UltimoCodigo
Despues de hacer un inser deberias hacer
UPDATE marcas SET ultimoCodigo=ultimoCodigo+1 WHERE idMarca=$idMarcaX
Tambien recuerda que deberias encapsular las distintas querys en una transaccion para asegurarte que si no se ejecutan todas se borren los resultados de las que si se hayan ejecutado.