sábado, 11 de junio de 2011

MySQL Console & Formas de usar SQL con PHP~

Bueno, aprovechando que he estado... esclavizado prácticamente sin parar de hacer consultas, voy a ampliar esto, ahora que no tengo exámenes a los que estudiar ni similares (Tengo proyectos de RomHacking pero eso es otra cosa xD lo llevo a la vez, y ya pondré cosillas al respecto, llevo apuntando un "diario" algún tiempo ^^).

Lo mejor, será acostumbrarse a usar MySQL, nuestra base de datos, desde consola de comandos... muchos programas dan problemas a veces (como a mí me dio el MySQL Control Center... que no me dejaba insertar una base de datos que por consola sí me dejo...), y lo mejor es ahorrarnos problemas.

Para entrar en esta consola, Inicio -> Ejecutar... (si es windows7, basta con ponerlo en el cuadro de búsqueda) -> Escribimos "cmd" sin las comillas, y pulsamos Enter. Está bien, ¿Recuerdas la instalación de MySQL?, pues, tienes que introducir:
cd C:\ruta-completa-a-la-carpeta-de-mysql\bin
(en mi caso, cd "C:\Program Files\MySQL\MySQL Server 5.1\bin". Poned comillas si hay espacios de por medio.)
Ahí debemos escribir lo siguiente:
mysql -u Usuario -pContraseña
Usuario, suele ser root. Contraseña, la que hayas puesto al instalar... y no, no es un error, tiene que estar PEGADA al -p, como en... -p12345.

Y hala, ya estás dentro. Tocaría explicar bastaaantes comandos de SQL, que luego usaremos sobre todo en PHP. Pero vamos, con que recuerdas como entrar, por ahora basta, ciérralo.


Eso sí, mi filosofía es: SQL simple, PHP para complicarlo. Esto es, yo busco la simpleza en las consultas SQL, aunque enseñaré de todo tipo, hasta lo mas chungo que he tenido el placer de encontrar... aunque yo, en lo personal, prefiero que se encargue de "post-procesar" las consultas el PHP.

EJEMPLO:

Tenemos una tabla tal que así:


Id_ProductoNombre_ProductoPrecio
1Algo100
2Otra cosa225
.........

Otra, que indica los clientes que hay:

Id_ClienteNombre
1Alguien
2Otro alguien
......

Y, bueno, tenemos otra más, que indica las compras (Relaciona ambas tablas anteriores... luego lo explico en profundidad):

Id_CompraId_ClienteId_ProductoCantidad
1225
22110
............

Pues... supongamos por un momento, que queremos una lista de qué clientes (Nombres) han comprado algo, QUÉ han comprado (Nombres también), y cuanto han gastado (en TOTAL...).

Bueno... hay 2 formas de asumir esto. Una consulta a varias tablas con SQL, o consultar a una, luego, dentro de ese resultado a otra, y así hasta tener todo relacionado, con PHP.

Suena más simple hacerlo con SQL, ¿Verdad?. Bueno, la consulta sería esta:
SELECT C.Nombre, P.Nombre_Producto, (P.Precio*C2.Cantidad) AS TOTAL FROM Clientes AS C, Productos AS P, Compras_Individuales AS C2 WHERE C2.Id_Cliente=C.Id_Cliente AND C2.Id_Producto=P.Id_Producto;

Marea un poco... pero esto no es nada xD. Si hubiéramos hecho la BD de forma que en una sola compra haya varios productos asignados, habría una tabla más de por medio, y no solo esta consulta no funcionaría, sino que además habría que añadir funciones de grupo u operaciones de conjuntos incluso... (aunque esto último no estoy seguro xD pero vamos, pasanding, que ni lo he explicado aún).

Y bueno, no negaré que tiene sus ventajas currarse bastante la consulta. Esto, en PHP lo podemos mostrar así:
    $query=mysql_query("SELECT C.Nombre, P.Nombre_Producto, (P.Precio*C2.Cantidad) AS TOTAL FROM Clientes AS C, Productos AS P, Compras_Individuales AS C2 WHERE C2.Id_Cliente=C.Id_Cliente AND C2.Id_Producto=P.Id_Producto;") or die(mysql_error());
    while($data=mysql_fetch_array($query)){
        echo "<tr>";
            echo "<td>".$data['Nombre']."</td>";
            echo "<td>".$data['Nombre_Producto']."</td>";
            echo "<td>".$data['TOTAL']."</td>";
        echo "</tr>";
    }
    mysql_free_result($query);

Y punto... (Perdón por tochazos sin explicar, es para que se vean dos puntos de vista distintos... cuando explique más, ya podrás decidir cual de "los dos métodos" prefieres. Según estés más cómodo con PHP o con SQL).

Pero claro... ¿Como sería lo mismo, pero simplificando consultas(Tirando más de PHP)?... Bueno... Es algo "menos eficiente", dado que tiene que hacer más consultas, pero si en esas consultas especificamos los campos, y... bueno, seguíis mis directrices, tampoco se nota. Son consultas simplísimas, tampoco afectan apenas al rendimiento. Aquí veréis:

    $query=mysql_query("SELECT Id_Cliente, Nombre FROM Clientes"));
    while($data=mysql_fetch_array($query)){
     //Aquí tendremos todos los datos, cliente por cliente, así que
     // podemos usar eso para las siguientes consultas.
     $query2=mysql_query("SELECT Id_Producto, Nombre_Producto, Precio FROM Productos");
     while($data2=mysql_fetch_array($query2)){
      //Y aquí tendremos los productos, además del cliente actual de esa iteración.
      // Ya explicaré PHP, no es el momento xD
      $idCli=$data['Id_Cliente'];
      $idProd=$data2['Id_Producto'];
      $query3=mysql_query("SELECT Cantidad FROM Compras_Individuales WHERE Id_Cliente=$idCli AND Id_Producto=$idProd");
      while($data3=mysql_fetch_array($query3)){
       echo "<tr>";
        echo "<td>".$data['Nombre']."</td>";
        echo "<td>".$data2['Nombre_Producto']."</td>";
        $total=$data2['Precio']*$data3['Cantidad'];
        echo "<td>$total</td>";
       echo "</tr>";
      }
      mysql_free_result($query3);
     }
     mysql_free_result($query2);
    }
    mysql_free_result($query);

Parece un tochazo increible ¿verdad...?. Observad como se repiten muchas partes. Es casi todo igual, y solo se complica al manejar las variables en la última consulta. Nada más. Y porque quería ponerlo algo más claro. Os explico como va este.

Veréis, la idea es coger los datos que necesitemos para usar luego... por ejemplo. Hacemos una consulta a Clientes, y cogemos la Id y el Nombre, porque nos piden el Nombre, y la Id la necesitaremos para relacionarlos. Se guardan en variables. Hacemos la siguiente, usando esas variables para el WHERE, si es necesario (en el tocho de antes solo fue necesario en la tercera), y así constantemente. OJO: Cuantas más tablas... menos eficiente es esto. Además, yo uso un poco de cada mundo.

Es decir, aunque prefiera resolver los problemas en PHP, normalmente hago consultas complejas con SQL, para ahorrarme código... Sin embargo, hay cosas que no se me ocurren como hacerlas en SQL sin complicar en exceso la consulta, o simplemente es una consulta muy compleja en sí. Y ahí entra un poco más de PHP.

Aunque la verdad, para empezar, si no quieres complicarte la vida, con PHP, se puede casi... copypastear (con mucho cuidado, muchísimo, eso sí), cosa que "agiliza" las cosas. Aunque es una mala manía a evitar. Para algo están las funciones xD.

En fín, este post ha sido más largo de lo que tenía pensado, así que en el próximo explico como crear una base de datos, como, por ejemplo, la que he usado de ejemplo aquí. Y tambien unas consultas sencillas... algo de sintaxis de SQL.

Un saludo~

0 comentarios:

Publicar un comentario

Seguidores

Etiquetas

About Me

Mi foto
Myaku Farron
Ver todo mi perfil
Hecho por Myaku. Con la tecnología de Blogger.