0

tengo la siguiente cuestión, quiero mostrar los datos repetidos que se encuentran almacenados en una tabla llamada Tesis como la siguiente: introducir la descripción de la imagen aquí

realizo lo siguiente:

public function mostrarlic(){

    $sql ="SELECT id_tesis, carrera FROM tesis WHERE carrera IN
                    (SELECT carrera FROM tesis GROUP BY carrera HAVING COUNT(id_tesis) > 1)";

    $result = $this->conecta()->query($sql);
    $mostrarlic = '';

while ($row = $result->fetch_assoc()) {

    $mostrarlic.=
    '<center>
        <div>
            <p class="des">
            <a href=""><i class="fa fa-file-pdf-o titulo" aria-hidden="true"></i>&nbsp;&nbsp;'.utf8_encode($row['carrera']).'</a>
            </p>
        </div>
    </center>';
    }
return $mostrarlic;
}

y me muestra los resultados que se repiten,

CARRERA


Licenciatura Administración

Licenciatura Administración

Licenciatura Administración

Pero si hay algún otro registro que se repita de igual manera me lo muestra, yo solo necesito que me muestre los resultados iguales de Lic administración.

Saben como puedo hacer eso? utilizar alguna otra forma de hacerlo??

R.C. Ana
  • 195
  • 1
  • 1
  • 15

2 Answers2

1

Inferiré que te refieres a que quieres los resultados repetidos de solamente una carrera. Sería cambiar el query:

$sql ="SELECT id_tesis, carrera FROM tesis WHERE carrera IN
       (SELECT carrera FROM tesis where carrera = 'Licenciatura en Administración' GROUP BY carrera HAVING 
       COUNT(id_tesis) > 1)";
Juan Pinzón
  • 9,007
  • 18
  • 48
  • 76
Belhenix
  • 278
  • 2
  • 8
0

Lo puedes resolver agregando un AND carrera='Carrera a filtrar' al final.

Ejemplo:

SQL Fiddle

MySQL 5.6 Schema Setup:

CREATE TABLE tesis
    (`id_tesis` int, `nombre_tesis` varchar(70), `carrera` varchar(55))
;

INSERT INTO tesis
    (`id_tesis`, `nombre_tesis`, `carrera`)
VALUES
    (16, 'Análisis...', 'Lic. en Criminología'),
    (17, 'Tesis en...', 'Licenciatura en Administración'),
    (18, 'Litigación en...', 'Maestría en...'),
    (19, 'Tesis en...', 'Licenciatura en Administración'),
    (26, 'La intranet...', 'Ingeniería ITC'),
    (28, 'Tesis en...', 'Licenciatura en Administración'),
    (29, 'Litigación en...', 'Maestría en...')

;

Query 1:

SELECT carrera
FROM tesis
WHERE carrera IN (
    SELECT carrera
    FROM tesis
    GROUP BY carrera
    HAVING COUNT(id_tesis) > 1
)
AND carrera='Licenciatura en Administración'

Results:

|                        carrera |
|--------------------------------|
| Licenciatura en Administración |
| Licenciatura en Administración |
| Licenciatura en Administración |


Nota:

De todos modos yo tendría una tabla llamada carreras relacionada con la tabla tesis mediante llave foránea. Como lo tienes ahora no es muy práctico, para consultas como estas o para controlar el tamaño de la bd, sobre todo si tienes que manejar muchos datos. El mantenimiento también se dificulta. Imagina que hay un error de ortografía en una de las filas de la columna carrera, pues ya por ese error no te filtraría bien los datos, etc, etc, etc.

Aquí te dejo otro fiddle parecido al anterior. En la primera parte dejo todo como antes, pero introduzco a propósito una tesis id 30 con datos erróneos. Es evidente que sería de la carrera Licenciatura en Administración, pero como ha sido digitada con errores la consulta no la encontrará debido a esos errores ortográficos.

En la segunda parte del fiddle implemento un modelo relacional, introduciendo las carreras en su tabla propia. En la consulta se usa un JOIN y la tabla tesis_relacional no tendrá que tener repetido una y otra vez el nombre de la carrera, sino un número que identifica a cada carrera. Estamos hablando de ahorro de espacio, de tiempo de mantenimiento, mejor detección de errores... y simplicidad en las consultas.

Además, la consulta te presenta una sola fila y no 3, 4 o 15,000 filas... lo cual es poco práctico. Si por algún motivo quieres presentar n filas con los nombres de carreras repetidas, lo puedes hacer mediante un bucle que imprima el dato de la columna carrera las veces indicadas en la columna total, estoy hablando de un código mejorado y con mejor rendimiento, ya que no es lo mismo sacar del servidor una sola fila, que sacar 3, 4 o n filas.

Espero te sea de ayuda.

SQL Fiddle

MySQL 5.6 Schema Setup:

CREATE TABLE tesis
    (`id_tesis` int, 
     `nombre_tesis` varchar(70), 
     `carrera` varchar(55))
;

INSERT INTO tesis
    (`id_tesis`, `nombre_tesis`, `carrera`)
VALUES
    (16, 'Análisis...', 'Lic. en Criminología'),
    (17, 'Tesis en...', 'Licenciatura en Administración'),
    (18, 'Litigación en...', 'Maestría en...'),
    (19, 'Tesis en...', 'Licenciatura en Administración'),
    (26, 'La intranet...', 'Ingeniería ITC'),
    (28, 'Tesis en...', 'Licenciatura en Administración'),
    (29, 'Litigación en...', 'Maestría en...'),
    (30, 'Tesis en...', 'Licenciatura en Administrción')


;


CREATE TABLE tesis_relacional
    (`id_tesis` int, `nombre_tesis` varchar(70), `id_carrera` int)
;

INSERT INTO tesis_relacional
    (`id_tesis`, `nombre_tesis`, `id_carrera`)
VALUES
    (16, 'Análisis...', 1),
    (17, 'Tesis en...', 2),
    (18, 'Litigación en...', 3),
    (19, 'Tesis en...', 2),
    (26, 'La intranet...', 4),
    (28, 'Tesis en...', 2),
    (29, 'Litigación en...', 1),
    (30, 'Tesis en...', 2)


;


CREATE TABLE carreras
    (`id_carrera` int, `nombre_carrera` varchar(70))
;


INSERT INTO carreras
    (`id_carrera`, `nombre_carrera`)
VALUES
    (1, 'Lic. en Criminología'),
    (2, 'Licenciatura en Administración'),
    (3, 'Maestría en...'),
    (4, 'Ingeniería ITC')

;

Query 1:

SELECT carrera
  FROM tesis
  WHERE 
    carrera IN (
      SELECT carrera
        FROM tesis
        GROUP BY carrera
        HAVING COUNT(id_tesis) > 1
    )
    AND carrera='Licenciatura en Administración'

Results:

|                        carrera |
|--------------------------------|
| Licenciatura en Administración |
| Licenciatura en Administración |
| Licenciatura en Administración |

Query 2:

-- SQL usando tesis_relacional

SELECT c.nombre_carrera, count(*) as total
  FROM carreras c
  INNER JOIN 
    tesis_relacional t ON c.id_carrera=t.id_carrera
  WHERE c.id_carrera=2 
  GROUP BY c.id_carrera
  HAVING COUNT(t.id_tesis) > 1 

Results:

|                 nombre_carrera | total |
|--------------------------------|-------|
| Licenciatura en Administración |     4 |
A. Cedano
  • 86,578
  • 19
  • 122
  • 221
  • Como el Query 1: del primer ejemplo no me muestra ningún resultado sabes a que se debe?? – R.C. Ana May 24 '17 at 23:03
  • Debería mostrar, a no ser que no existan datos con los criterios que estés indicando en el `WHERE`. Los ejemplos y sus resultados demuestran que funciona, otra cosa es que existan o no datos con los criterios de búsqueda. – A. Cedano May 24 '17 at 23:25
  • Ya se a que se debe, no me esta leyendo los datos que tienen caracteres como ó, ñ, etc. saben como puedo solucionar esa parte?? – R.C. Ana May 27 '17 at 14:39
  • @R. Vivi podrías solucionarle dando a las columnas `nombre_tesis` y `carrera` la COLLATION `utf8_spanish_ci`. Esto se hace en las propiedades de la BD, mejor hacerlo desde PHPMyAdmin si es posible, en editar cada una de esas columnas. Te recomiendo [la lectura de esta entrada](http://blog.unreal4u.com/2012/08/sobre-collation-y-charset-en-mysql/) para una mejor comprensión. – A. Cedano May 27 '17 at 14:50
  • si tengo agregado utf8_spanish_ci en cada una de las columnas de mi BD, no entiendo a que se deba – R.C. Ana May 27 '17 at 15:59
  • Entonces podría ser un problema de encodaje a otro nivel. Por favor [revisa esta respuesta](https://es.stackoverflow.com/a/59510) el problema en este caso puede ser que no estás estableciendo utf8 cuando creas la conexión o en la configuración de PHP. – A. Cedano May 27 '17 at 17:15
  • Si era eso, revise mi código y donde mandaba llamar e imprimía las variables me faltaba agregar utf8, muchas gracias por su ayuda, le agradezco enormemente. Saludos. – R.C. Ana May 27 '17 at 17:48
  • @R. Viví De nada. Considera marcar como solución la respuesta que ha resuelto el problema activando la flecha-cotejo de la izquierda para que no quede abierta. También puedes votar la respuesta positivamente pulsando en la flecha gris que apunta hacia arriba. Saludos. – A. Cedano May 27 '17 at 17:50