Contar un resultado de una variable para que no se repita

  • Autor Autor xaiborweb
  • Fecha de inicio Fecha de inicio
xaiborweb

xaiborweb

Dseda
Programador
No recomendado
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
hola resulta que tengo una

tabla de enlaces con
[table="width: 500"]
[tr]
[th]id_movie[/th]
[th]url[/th]
[th]audio[/th]
[th]calidad[/th]
[/tr]
[tr]
[td]1[/td]
[td]enlace[/td]
[td]es[/td]
[td]hd[/td]
[/tr]
[tr]
[td]1[/td]
[td]enlace[/td]
[td]es[/td]
[td]dvd[/td]
[/tr]
[tr]
[td]1[/td]
[td]enlace[/td]
[td]la[/td]
[td]dvd[/td]
[/tr]
[tr]
[td]1[/td]
[td]enlace[/td]
[td]la[/td]
[td]cam[/td]
[/tr]
[tr]
[td]1[/td]
[td]enlace[/td]
[td]en[/td]
[td]cam[/td]
[/tr]
[/table]

y en otra tabla debe quedar todos los audios disponibles pero sin repetirse entre si (osea que no pase esto es|es) y la mejor calidad, ejemplo debería quedar así

[table="width: 500"]
[tr]
[th]id_movie[/th]
[th]content[/th]
[th]audio[/th]
[th]calidad[/th]
[/tr]
[tr]
[td]1[/td]
[td]content[/td]
[td]es|la|en[/td]
[td]hd[/td]
[/tr]
[/table]

hasta ahora obtengo todas las filas por el id_movie y las meti dentro de un while para ver todo
PHP:
<?php 
$servidor = 'localhost';
$db = 'db';
$u = 'root';
$p = '';
$con = mysqli_connect($servidor,$u,$p,$db);

$id_movie = '1';
$audios = mysqli_query($con,"SELECT audio FROM link_movies_en WHERE id_movie=$id_movie");
while ($audio = mysqli_fetch_row($audios)) {

	echo $audio[0];

}

pero ahora no se como hacer con php para lograr el resultado que necesito, se agradece cualquier ayuda 😉
 
Última edición:
Pues no entendí que es lo que quieres hacer.

Por cierto, para qué tienes el campo audio en la segunda tabla si ya tienes un registro por cada audio en la primera?

Saludos.
 
Pues no entendí que es lo que quieres hacer.

Por cierto, para qué tienes el campo audio en la segunda tabla si ya tienes un registro por cada audio en la primera?

Saludos.

por que la primera es una tabla de enlaces y ya van de 1 millon xd, mientras que la segunda es una tabla de cada movie y solo ban 60 mil, y necesito mostrar el audio y calidad en el home y géneros, entonces no quiero hacerle una consulta a un tabla de mas de 1 millon y hacer super lenta la pagina y sobrecargar las peticiones sql cuando puedo trabajar con una tabla de menor tamaño por eso necesito tomas todos los audios únicos y la mejor calidad de cada id_movie de la tbala enlaces y pasarla a la tabla movies.

espero haberme explicado mejor.
 
Creo que ya te entendí.

Lo que se me ocurre es que la consulta la saques con un GROUP BY por id_movie, y tanto audio como calidad hazlos con un GROUP_CONCAT y ponles un delimitador.

Ya en el while combiente ambos campos a array por el delimitador de le pusiste.
Para eliminar audios repetidos, si mal no recuerdo hay una funcion para array que te elimina valores repetido.
Y para lo de escoger la mejor calidad tendrías que especificar de una forma una prioridad en las calidades y a una función mandarle el array y que te regrese la mejor. (REcuerdo que una vez para un usuario le hice algo similar, pero solo para ordenar dependiendo de unas prioridades que él podía establecer).

Saludos.
 
Pero es|la|en no estan en una columna ?
 
Insertar CODE, HTML o PHP:
SELECT GROUP_CONCAT(DISTINCT audio SEPARATOR '|') AS audio, calidad
FROM tabla
WHERE calidad IN ('hd','dvd','cam');
 
Creo que ya te entendí.

Lo que se me ocurre es que la consulta la saques con un GROUP BY por id_movie, y tanto audio como calidad hazlos con un GROUP_CONCAT y ponles un delimitador.

Ya en el while combiente ambos campos a array por el delimitador de le pusiste.
Para eliminar audios repetidos, si mal no recuerdo hay una funcion para array que te elimina valores repetido.
Y para lo de escoger la mejor calidad tendrías que especificar de una forma una prioridad en las calidades y a una función mandarle el array y que te regrese la mejor. (REcuerdo que una vez para un usuario le hice algo similar, pero solo para ordenar dependiendo de unas prioridades que él podía establecer).

Saludos.

vale muchas gracias pero yo soy un super novato en php todo lo que hago es a malicia indígena xd, me preguntaba si podridas compartir un ejemplo de un código funcional

Pero es|la|en no estan en una columna ?

no quiero que quede asi en una columna es|la|en pero están en la tabla enlaces en mas de 20 filas, ya en palabras cristianas y no técnicas es una db de películas y quiero que en la tabla de las películas aparezca la mejor calidad y los idiomas que tiene los enlaces la movie para asi desde el home géneros etc poder mostrar esta información, y no quiero recurrir a hacer una consulta a la tabla links por que es muy grande y si muestro 40 movies en el home multiplicarla por una consulta cada una a la tabla de enlaces es una locura cuando la tabla de enlaces tiene mas de 1 millón de filas,

es por eso que lo que estoy haciendo es un php que busque en la tabla enlaces por el id_movie y coja los audios únicos y mejor calidad que seria así en orden desendente (hd, dvd, cam) y los peque en la tabla movies, y en hacer este php es que estoy liado.

Insertar CODE, HTML o PHP:
SELECT GROUP_CONCAT(DISTINCT audio SEPARATOR '|') AS audio, calidad
FROM tabla
WHERE calidad IN ('hd','dvd','cam');

no entendí ?

- - - Actualizado - - -


parece que me compartiste la solución pero no la entiendo bien xd,
yo estaba asciendo la petición así:
PHP:
<?php 
$servidor = 'localhost';
$db = 'db';
$u = 'root';
$p = '';
$con = mysqli_connect($servidor,$u,$p,$db);

$id_movie = '1';
$audios = mysqli_query($con,"SELECT id,audio,calidad FROM link_movies_en WHERE id_movie=$id_movie");
while ($audio = mysqli_fetch_row($audios)) {

    echo $audio[0];

}
y así imprimo todos los audios y calidades de ese movie_id pero entonces como lo cambiaría para tu ejemplo ? muchas gracias
 
Algo como:

SQL:
PHP:
SELECT id_movie,
        GROUP_CONCAT(DISTINCT audio SEPARATOR '|') AS audio,
        GROUP_CONCAT(DISTINCT calidad SEPARATOR '|') AS calidad
    FROM link_movies_en
    GROUP BY id_movie;

PHP:
function getPriority()
{
    return array(
        'hd',
        'dvd',
        'cam',
    );
}

function compareQly($one, $two)
{
    $priority = getPriority();

    return (array_search($one, $priority) < array_search($two, $priority));
}

function bestQuality(array $qltys)
{
    if (!$qltys) {
        return '';
    }

    $bestQlty = array_shift($qltys);

    foreach ($qltys as $row) {
        if (!compareQly($bestQlty, $row)) {
            $bestQlty = $row;
        }
    }

    return $bestQlty;
}

PHP:
while ($post = mysqli_fetch_object($audios)) {
    // $post->id_movie
    // $post->audio
    // $calidad = bestQuality(explode('|', $post->calidad))
}

Y en el array de la función getPriority tendrías que agregar todas las calidades de mejor a peor.

Saludos.
 
Última edición:
No necesitas 2 tablas, puedes crear una simple tabla(la primera) y gracias a un GROUP BY id_movie,audio el resultado sería:

id_movie url audio calidad
1 enlace es hd
1 enlace la dvd
1 enlace en cam

Y para la mejor calidad lo único que tienes que hacer es crear una tabla con las distintas calidades (Ordenadas por su calidad)

id id_calidad calidad
1 1 hd
1 3 dvd
1 2 cam

y después asociar cada enlace a esa calidad.

id_movie url audio id_calidad
1 enlace es 1
1 enlace la 3
1 enlace en 2
 
Atrás
Arriba