Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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:
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
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...
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;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>
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:
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.
LIMIT 0,10
Ainda não entendi os '2 limits em uma única SQL', qual a necessidade ?