No estás registrado (Registrarse)

Vanilla 1.1.10 es un producto de Lussumo. Para más información: Documentación, Soporte.

    •  
      CommentAuthorignatius
    • CommentTimeFeb 13th 2012
     # 1
    Estoy un poco atascado con esta consulta. Tengo tres tablas (entre otras) :dumb:

    projects (id, user_id, title, description...)
    users (id, username...)
    project_states (project_id, state, date...) En esta tabla se van añadiendo registros que recogen los distintos cambios de estado que sufre el proyecto; el último, el de fecha más registro -el de fecha más reciente- recoge el estado actual del proyecto

    Quiero hacer una consulta que liste los proyectos, a qué usuario corresponden y su estado a tual, que requiere unir las tres tablas. El problema es que si bien entre projects y users tenemos una equivalencia de uno a uno, al añadir project_states la cosa se me complica, entiendo que tengo que hacer una subconsulta pero no termino de encajarlo...

    SELECT p.id, p.user_id, p.title, u.username, ps.state FROM projects p
    JOIN users u ON p.user_id = u.id
    JOIN project_states ps ON p.id = (
    SELECT psi.project_id FROM project_states psi WHERE psi.project_id=p.id ORDER BY date DESC LIMIT 1
    )


    :que:
    •  
      CommentAuthorignatius
    • CommentTimeFeb 13th 2012
     # 2
    Solucionado, por si a alguno le sirve:


    SELECT p.id, p.user_id, p.title, u.username, (SELECT ps.state FROM project_states ps WHERE ps.project_id=p.id ORDER BY ps.date DESC LIMIT 1) state FROM projects p
    JOIN users u ON p.user_id = u.id


    Ahora a ver cómo meto una subconsulta en CodeIgniter (Javiiiiiiiiiii :pray:)
    •  
      CommentAuthorJemact
    • CommentTimeFeb 14th 2012
     # 3
    Siempre puedes crear una vista

    Un saludo
    •  
      CommentAuthorJavi
    • CommentTimeFeb 14th 2012
     # 4
    Posted By: ignatiusSolucionado, por si a alguno le sirve:


    SELECT p.id, p.user_id, p.title, u.username, (SELECT ps.state FROM project_states ps WHERE ps.project_id=p.id ORDER BY ps.date DESC LIMIT 1) state FROM projects p
    JOIN users u ON p.user_id = u.id


    Ahora a ver cómo meto una subconsulta en CodeIgniter (Javiiiiiiiiiii :pray:)Días fértiles|Calculadora|Ordena tus listas de dominios con Disorter.com


    creo que tenia la funcion query, algo asi fomo un campo "libre" para lanzar consultas
    •  
      CommentAuthorignatius
    • CommentTimeFeb 14th 2012
     # 5
    Posted By: JemactSiempre puedes crear una vista


    Me pierdo un poco con eso...


    Posted By: Javicreo que tenia la funcion query, algo asi fomo un campo "libre" para lanzar consultas


    efectivamente...

    $query=$this->db->query($miconsulta);

    Gracias! :cataa:
    •  
      CommentAuthorJemact
    • CommentTimeFeb 14th 2012
     # 6
    Posted By: Jemact
    Siempre puedes crear una vista


    Me pierdo un poco con eso...


    Una vista seria como crear una tabla virtual que se genera con los resultados de esa consulta a la que podrias acceder y consultar como una tabla normal.

    Un saludo
    •  
      CommentAuthorignatius
    • CommentTimeFeb 14th 2012 editado
     # 7
    Posted By: Jemact

    Una vista seria como crear una tabla virtual que se genera con los resultados de esa consulta a la que podrias acceder y consultar como una tabla normal.


    Ok, sí, lo que son las vistas lo tenía más o menos claro... lo que no atinaba es a ver cómo darle uso en este caso...
    Gracias!
    •  
      CommentAuthorignatius
    • CommentTimeFeb 28th 2012 editado
     # 8
    Rescato el hilo para hacer otra pregunta y, si os parece bien y hay más gente con este tipo de dudas, podemos ponerlas por aquí...

    ¿Cómo puede hacerse un JOIN a otra tabla en la que no exista correspondencia plena en todos los registros? Por ejemplo, tenemos 2 tablas (simplificando mucho y por poner un ejemplo, que en una estructura final esto tendría un desarrollo más relacional):

    admins (id, username, email...)
    users (id, username, email...)
    comments (id, product_id, user_id, comment, date, admin_id...) [el campo admin_id solo se utilizará para aquellos comentarios que hayan sido editados por un administrador y contendrían su id, en el resto de comentarios, tendría valor 0)

    si hago un


    SELECT c.comment, c.date, c.user_id, c.admin_id FROM comments c
    JOIN users u ON c.user_id=u.id
    JOIN admins a ON c.admin_id=a.id
    WHERE c.product_id = '$id'


    al no haber corresponencia con la tabla de admins en todos los registros, porque no existe un admin con id valor 0, solo devolverá los registros de comentarios que hayan sido editados por admins. Por supuesto podría recorrer los resultados y averiguar el admin donde corresponda pero intento aprender un poco y dejar atrás esos días :dumb:

    Gracias!
    •  
      CommentAuthorJavi
    • CommentTimeFeb 29th 2012
     # 9
    ignatius, en este caso, que quieres obtener? me he perdido un poco la verdad :dumb:
    •  
      CommentAuthorPedro
    • CommentTimeFeb 29th 2012
     # 10
    Creo entender que quiere que la sql le devuelva todos los registros de la tabla comentarios, y no solamente los que tengan un id equivalente en la tabla admins.

    Se podría resolver con un LEFT JOIN, creo recordar:

    http://dev.mysql.com/doc/refman/5.0/es/join.htmlSi no hay ningún registro coincidiente para la tabla de la derecha en la parte ON o USING en un LEFT JOIN, se usa un registro con todos las columnas a NULL para la tabla de la derecha.
    X-Y.es
    •  
      CommentAuthorignatius
    • CommentTimeFeb 29th 2012
     # 11
    Posted By: Javique quieres obtener? me he perdido un poco la verdad :dumb:


    Posted By: PedroCreo entender que quiere que la sql le devuelva todos los registros de la tabla comentarios, y no solamente los que tengan un id equivalente en la tabla admins.


    Exacto, precisamente eso :bigsmile:

    Posted By: PedroSe podría resolver con un LEFT JOIN, creo recordar:


    Gracias, voy a mirarlo :cataa:
    •  
      CommentAuthorignatius
    • CommentTimeFeb 29th 2012 editado
     # 12
    Posted By: PedroSe podría resolver con un LEFT JOIN, creo recordar:


    Concretamente, sería con LEFT OUTER JOIN; que lo que hace es que pilla todos los registros aun aquellos en los que no hay una coincidencia y a ésos les da el valor NULL

    Os recomiendo este vídeo que está en inglés pero lo explica muy facilito...
    •  
      CommentAuthorJavi
    • CommentTimeFeb 29th 2012
     # 13
    Interesante, gracias :typeo:
    •  
      CommentAuthorignatius
    • CommentTimeFeb 27th 2015 editado
     # 14
    Rescato el hilo con otra consulta:

    Estoy generando una vista a partir de un SELECT que cruza varias tablas distintas con joins y subconsultas (las quito para simplificar) y que me muestra los últimos logins de usuarios con unas características concretas (varias condiciones WHERE) y distintas columnas con información sobre su perfil; en su versión muy simplificada, la consulta vendría a ser algo como:

    SELECT l.idUsuario, fu.username_canonical, fu.email_canonical, u.tipo, l.fecha FROM logs AS l INNER JOIN usuario AS u ON u.idUsuario = l.idUsuario INNER JOIN fos_user AS fu ON fu.idUsuario = l.idUsuario WHERE u.tipo='tipo-de-usuario-x' AND l.accion='login' ORDER BY l.fecha DESC


    El caso es que no quiero ver repetidas en varias filas por usuario; solo me gustaría una única fila por usuario que se refiera al del login más reciente; el campo fecha de la tabla logs es DATETIME.

    Entiendo que tendría que hacerlo con GROUP BY id o algo así pero... no consigo pillar el último y coordinar los having con el where. :smash:
    •  
      CommentAuthorPaco
    • CommentTimeFeb 27th 2015 editado
     # 15
    has probado , una subconsulta en el where : fecha in select MAX(fecha) .... para extraer la última fecha para cada login de usuario
    puede que no sea la mejor opción sobre todo si es una tabla grande :dumb:
    •  
      CommentAuthorignatius
    • CommentTimeFeb 27th 2015 editado
     # 16
    Posted By: Pacohas probado , una subconsulta en el where : fecha in select MAX(fecha)


    Pues la verdad es que no... podría ser; es verdad que en términos de recursos igual es no rinde tanto pero... posiblemente funcionaría. Me lo apunto, gracias!!
    A ver si alguien, de todas formas, apunta algo con el group by, que los ejemplos típicos de los tutoriales y vídeos sí que los pillo pero aquí me hago un lío jeje
    •  
      CommentAuthorPaco
    • CommentTimeFeb 27th 2015
     # 17
    como estas probando el group by?
    en esa consulta faltan subquerys, having ?
    •  
      CommentAuthorcrakup
    • CommentTimeFeb 27th 2015 editado
     # 18
    Podrías subir un ejemplo a sqlfiddle.com para tenerlo más claro y tratar de ayudarte. :typeo:
    •  
      CommentAuthorignatius
    • CommentTimeFeb 27th 2015
     # 19
    Posted By: Pacocomo estas probando el group by?
    en esa consulta faltan subquerys, having ?


    En la consulta faltan subqueries pero no son relevantes, las he quitado para simplificar aquí, solo añaden columnas con más datos de los usuarios que se sacan de distintos sitios.

    Pues estoy probando con muchas :dumb: y he conseguido que funcione con esto en gran parte gracias a tu sugerencia :cataa:

    SELECT l.idUsuario, fu.username_canonical, fu.email_canonical, u.tipo, l.fecha FROM logs AS l
    INNER JOIN usuario AS u ON u.idUsuario = l.idUsuario
    INNER JOIN fos_user AS fu ON fu.idUsuario = l.idUsuario
    INNER JOIN (SELECT idUsuario, MAX(fecha) max_fecha FROM logs WHERE accion='login' GROUP BY idUsuario) AS fe ON fe.max_fecha = l.fecha AND fe.idUsuario = l.idUsuario
    WHERE u.tipo='usuario-tipo-x' AND l.accion='login'
    ORDER BY l.fecha DESC


    lo que no sé si habrá alguna forma más eficiente :typeo:
    •  
      CommentAuthorignatius
    • CommentTimeFeb 27th 2015 editado
     # 20
    Mi gozo en un pozo, funciona como query pero no puedo convertirla en vista:

    View's SELECT contains a subquery in the FROM clause


    :smash:

    Edito, me he creado otra vista intermedia y listo... :first:
    •  
      CommentAuthorcrakup
    • CommentTimeFeb 27th 2015
     # 21
    A ver, prueba..


    SELECT l.idUsuario, fu.username_canonical, fu.email_canonical, u.tipo, MAX(l.fecha) FROM logs AS l
    INNER JOIN usuario AS u ON u.idUsuario = l.idUsuario
    INNER JOIN fos_user AS fu ON fu.idUsuario = l.idUsuario
    WHERE u.tipo = 'tipo-de-usuario-x' AND l.accion = 'login'
    GROUP BY l.idUsuario
    ORDER BY MAX(l.fecha) DESC

    :typeo:
    •  
      CommentAuthorignatius
    • CommentTimeFeb 27th 2015
     # 22
    Posted By: crakupA ver, prueba..


    Fuck yeah!

    La elegancia de la sencillez :cataa: :cataa:

    Muchas gracias!
    •  
      CommentAuthorignatius
    • CommentTimeMar 4th 2015 editado
     # 23
    Sigo con mi aprendizaje SQL haciendo análisis de los datos :typeo:

    Estoy listando el número de usuarios registrados en cada mes por tipo de usuario.

    SELECT CONCAT_WS('-', YEAR(Fecha_registro), MONTH(Fecha_registro)) AS mes,
    count(idUsuario) AS numero_usuarios
    FROM usuario WHERE tipo='tipo-usuario-x'
    GROUP BY mes
    ORDER BY mes


    Lógicamente solo me devuelve los meses en los que haya registros para ese tipo de usuario. Se os ocurre alguna forma rápida de que aparezcan todos los meses intermedios aunque con valor cero?

    Gracias!
    •  
      CommentAuthorignatius
    • CommentTimeMar 4th 2015
     # 24
    Bueno... la he perfeccionado un poco para usar meses con dos dígitos añadiendo el 0 y que quede bien ordenado y meter varios tipos de usuarios en distintas columnas... queda muuucho mejor pero sigo sin idea de cómo poner los meses que estén a cero:

    SELECT DATE_FORMAT(Fecha_registro,'%Y-%m') AS mes, count(idUsuario) AS num_usuarios, (

    SELECT count(idUsuario) FROM usuario WHERE DATE_FORMAT(Fecha_registro,'%Y-%m')=mes
    AND tipo='usuario-tipo-x'

    ) AS num_usuarios_tipo_x, (

    SELECT count(idUsuario) FROM usuario WHERE DATE_FORMAT(Fecha_registro,'%Y-%m')=mes
    AND tipo='usuario_tipo_y'

    ) AS num_usuarios_tipo_y

    FROM usuario GROUP BY mes ORDER BY mes
    •  
      CommentAuthorcrakup
    • CommentTimeMar 4th 2015 editado
     # 25
    Hasta donde tengo entendido no puedes agrupar valores que no existen.
    Suponiendo que en marzo de 2015 no hubiera registros, eso no significa que count(2015-03) sea igual a 0 porque de todas formas podrías agruparlo con un outer join, el problema es que no hay valor '2015-03' y por lo tanto no puedes aplicarle una función.
    Lo que podrías hacer es un subquery que devuelva las fechas que hacen falta y luego un outer join.
    El inconveniente es que llenar las fechas del subquery manualmente sería tedioso si vas a hacer la consulta muy seguido, te convendría más crear otra tabla con las fechas que necesitas y ya luego un outer join.
    •  
      CommentAuthorignatius
    • CommentTimeMar 4th 2015 editado
     # 26
    Hace unos segundos se me ha encendido la bombilla pensando en tener una tabla con meses y luego me he dicho; igual funcionaría pero es una solución cutre seguro que hay algo con más fundamento :dumb:

    Muchas gracias de nuevo, crakup, crack! :cataa:
    •  
      CommentAuthorcrakup
    • CommentTimeMar 4th 2015
     # 27
    Posted By: ignatiuses una solución cutre seguro que hay algo con más fundamenteo

    Pues sí está algo cutre pero es lo que hay. :bro:
    •  
      CommentAuthorignatius
    • CommentTimeMar 4th 2015
     # 28
    Igual se podría crear una tabla temporal automática con los meses entre el primer y último registro; no me interesa tanto como para ponerme ahora pero lo miraré :typeo:

    Gracias, de nuevo :cataa:
    •  
      CommentAuthorignatius
    • CommentTimeAug 5th 2016
     # 29
    Estoy tratando de restaurar un dump de mysql de poco más de 50 megas en una base de datos de un servidor remoto desde la línea de comandos pero simplemente no hace nada; no da ninguna clase de error ni nada parecido. Entras a la base de datos y está vacía no hay ninguna tabla.

    He probado con mysql, mysqlimport incluso con source una vez dentro del propio mysql.

    También he probado a aumentar los recursos del servidor y hasta editar el my.cnf para poner el bulk_insert_buffer_size a 512M y 1024M pero no hay ningún cambio...

    ¿alguna idea de qué puede estar pasando? Gracias! :typeo:
    •  
      CommentAuthorCorso
    • CommentTimeAug 5th 2016
     # 30
    ¿Qué dicen los logs? :typeo::: el roce hace el dominio ::
    •  
      CommentAuthorignatius
    • CommentTimeAug 5th 2016
     # 31
    El único log que tiene 'contenido' es el error.log de /var/log/mysql/error.log

    Este es el contenido imediatamente posterior al último reinicio del sistema e intento de restaurar el dump hasta el final del archivo; no veo nada relevante... :dumb:

    160805 18:13:40 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
    160805 18:13:40 [Note] Plugin 'FEDERATED' is disabled.
    160805 18:13:40 InnoDB: The InnoDB memory heap is disabled
    160805 18:13:40 InnoDB: Mutexes and rw_locks use GCC atomic builtins
    160805 18:13:40 InnoDB: Compressed tables use zlib 1.2.8
    160805 18:13:40 InnoDB: Using Linux native AIO
    160805 18:13:40 InnoDB: Initializing buffer pool, size = 128.0M
    160805 18:13:40 InnoDB: Completed initialization of buffer pool
    160805 18:13:40 InnoDB: highest supported file format is Barracuda.
    160805 18:13:40 InnoDB: Waiting for the background threads to start
    160805 18:13:41 InnoDB: 5.5.38 started; log sequence number 36069578
    160805 18:13:41 [Note] Server hostname (bind-address): '127.0.0.1'; port: 3306
    160805 18:13:41 [Note] - '127.0.0.1' resolves to '127.0.0.1';
    160805 18:13:41 [Note] Server socket created on IP: '127.0.0.1'.
    160805 18:13:41 [Note] Event Scheduler: Loaded 0 events
    160805 18:13:41 [Note] /usr/sbin/mysqld: ready for connections.
    Version: '5.5.38-0ubuntu0.14.04.1' socket: '/var/run/mysqld/mysqld.sock' port: 3306 (Ubuntu)
    1053,1 Bot
    •  
      CommentAuthorCorso
    • CommentTimeAug 5th 2016
     # 32
    ¿Algún tema de permisos? :dumb::: el roce hace el dominio ::
    •  
      CommentAuthorcrakup
    • CommentTimeAug 5th 2016
     # 33
    ¿Qué comando estás escribiendo para restaurar?
    •  
      CommentAuthorignatius
    • CommentTimeAug 6th 2016
     # 34
    Posted By: Corso¿Algún tema de permisos? :dumb:


    pues he probado hasta con root user del sistema y de la base de datos...



    Posted By: crakup¿Qué comando estás escribiendo para restaurar?


    Pues he probado con muchas opciones distintas, indicando contraseña en la propia línea y sin hacerlo, indicando nombre de la base de datos y sin hacerlo y no sé cuántas opciones más :dumb:... pero en general:

    mysql -u usuariodb -p basededatos < /path/to/miarchivo.sql
    •  
      CommentAuthorCorso
    • CommentTimeAug 6th 2016
     # 35
    ¿El dump tiene contenido? :dumb::: el roce hace el dominio ::
    •  
      CommentAuthorignatius
    • CommentTimeAug 6th 2016
     # 36
    Posted By: Corso¿El dump tiene contenido? :dumb:


    Es de las pocas cosas de las que estoy seguro :dumb:

    Muy curioso; estaba tan harto que me he creado otra máquina básica LAMP sobre Ubuntu 14.04 y aquí me va a la perfección. La nave del misterio.
    •  
      CommentAuthorPaco
    • CommentTimeAug 7th 2016
     # 37
    por decir algo, revisa los permisos del directorio donde está el fichero? :dumb: