Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

André Severino

Usando LIMIT

Recommended Posts

Boa noite pessoal,

 

Estou tentando procurar na internet algo relativo a minha dúvida + não sei nem como pesquisar :(, então venho pedir a ajuda de vocês.

Bom vou ilustrar um exemplo, tenho 2 tabelas usuario e contato no caso 1 usuário pode ter n contato(telefones/emails/sites/etc...) :

 

Agora vamos supor que nessa tabela exista 2 registros, sendo o primeiro registro com 20 contatos e o outro com 40 contatos.

 

Agora a dúvida:

- Como eu faço para trazer apenas 10 contatos, ou seja, apenas um limit de 10 contatos, mas todossss os usuários cadastrados:

 

Seria algo assim,

 

André

- Contato 1

- Contato 2

.....

- Contato 10

 

Marcos

- Contato 1

... etc....

 

 

Alguém sabe como posso fazer para resolver esse problema? Ou já se deparou com um problem igual a esse e como fez para solucionar?

 

Obrigado e até mais

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desta forma usando LIMIT 0,10 eu trago 10 registros apenas, ou seja, 10 funcionarios, eu queria trazer 10 funcionarios e 10 contatos desse funcionário, por isso teria que ter 2 limit...

 

Porque sem 2 limit eu tenho que limitar dentro do php usando um

$i = 0 ;
foreach($valores as $value) {

 if($i < 10) {

   echo $value->contato . '<br />';
 }

 $i++;
}

 

Logicamente falando seria algo assim

 

SELECT f.fun_nome, c.contato FROM funcionario AS f

INNER JOIN contato AS c

ON c.fk_id_funcionario = f.fun_id LIMIT 0,10

ORDER BY f.fun_nome

LIMIT 0,10

 

Seria algo como essa instrução acima...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, então vamos pela matemática irreversível dos números ..

set @rowNumber = 0;
set @employee = '';
select nomeCompleto , idFuncionario , @rowNumber := if( @employee = nomeCompleto , @rowNumber + 1 , 1 ) as rowNumber ,
@employee := nomeCompleto from `funcionarios` inner join `contatos` on `funcionarios`.id = `contatos`.idFuncionario 
group by nomeCompleto, idFuncionario, rowNumber having rowNumber <= 2

 

Example:

andrey@andrey:~$ mysql -u root -p
Enter password: ************
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 103
Server version: 5.1.41 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create schema imasters;
Query OK, 1 row affected (0.00 sec)

mysql> use imasters;
Database changed
mysql> create table funcionarios(
   ->    id integer not null auto_increment,
   ->    nomeCompleto varchar( 32 ),
   ->   primary key( id )
   -> )engine = myisam;
Query OK, 0 rows affected (0.03 sec)

mysql> create table contatos(
   ->    idContato smallint(6) not null auto_increment,
   ->     idFuncionario integer,
   ->     tipoContato varchar( 16 ),
   ->    contato varchar(72),
   ->   primary key( idContato )
   -> )engine = myisam;
Query OK, 0 rows affected (0.03 sec)


mysql> select * from funcionarios;
+----+---------------------+
| id | nomeCompleto        |
+----+---------------------+
|  1 | Andrey Knupp ..     |
|  2 | Geraldo Roberto ..  |
+----+---------------------+
2 rows in set (0.00 sec)


mysql> select * from contatos;
+-----------+---------------+-------------------+-------------------------+
| idContato | idFuncionario | tipoContato       | contato                 |
+-----------+---------------+-------------------+-------------------------+
|         1 |             1 | E-mail            | andreykvital@gmail.com  |
|         2 |             1 | E-mail Alternativo| andreyknupp@hotmail.com |
|         3 |             1 | Telefone          | 90902569121( Orelhão )  |
|         4 |             2 | Telefone          | 90902569166( Orelhão )  |
|         5 |             2 | E-mail Alternativo| g.eraldo@gmail.com      |
|         6 |             2 | E-mail            | g.robert@gmail.com      |
+-----------+---------------+-------------------+-------------------------+
6 rows in set (0.00 sec)

mysql> set @rowNumber = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> set @employee = '';
Query OK, 0 rows affected (0.00 sec)

mysql> select nomeCompleto , idFuncionario , @rowNumber := if( @employee = nomeCompleto , @rowNumber + 1 , 1 ) as rowNumber ,
   -> @employee := nomeCompleto from `funcionarios` inner join `contatos` on `funcionarios`.id = `contatos`.idFuncionario;
   -> group by nomeCompleto, idFuncionario, rowNumber having rowNumber <= 2
+---------------------+---------------+-----------+---------------------------+
| nomeCompleto        | idFuncionario | rowNumber | @employee := nomeCompleto |
+---------------------+---------------+-----------+---------------------------+
| Andrey Knupp ..     |             1 |         1 | Andrey Knupp ..           |
| Andrey Knupp ..     |             1 |         2 | Andrey Knupp ..           |
| Geraldo Roberto ..  |             2 |         1 | Geraldo Roberto ..        |
| Geraldo Roberto ..  |             2 |         2 | Geraldo Roberto ..        |
+---------------------+---------------+-----------+---------------------------+
4 rows in set (0.00 sec)

mysql>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum, valeu Andrey, teria como você explicar ISSO:

 

set @rowNumber = 0;

set @employee = '';

 

e depois na query você fez isso:

@rowNumber := if( @employee = nomeCompleto , @rowNumber + 1 , 1 ) as rowNumber , @employee := nomeCompleto

 

fiquei boiando :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Simples, essas variáveis são usadas para contar os registros, você vai verificar se o 'rowNumber' ( alias de @rowNumber ) tem o valor 2, se tiver .. para a leitura de X registro e vai pro próximo, se não tiver, continua a leitura. @ + nome = variável.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.