Fabiano R Postado Julho 1, 2009 Denunciar Share Postado Julho 1, 2009 Bom dia,Irei explicar meu problema;minhas tablas: tb_user +-----+----+ | ID | name | +-----+----+ | 1 | Mary | | 2 | Nick | | 3 | Jhon | | 4 | Brad | +-----+----+ tb_adj +---------+--------+ | ID | name | +---------+--------+ | 1 | nice | | 2 | rich | | 3 | sexy | | 4 | ugly | | 5 | fat | +---------+--------+ tb_connection +-----+----+ | ID | ID_user | ID_adj | +-----+----+ | 1 | 1 | 1 | | 2 | 1 | 3 | | 3 | 4 | 3 | | 4 | 2 | 5 | | 5 | 2 | 5 | | 6 | 1 | 2 | +-----+----+ Eu quero selecionar pessoas que são sexy e rich minha Query; SELECT name FROM tb_user, tb_connection WHERE tb_connection.ID_user = tb_user.ID AND (tb_connection.ID_adj='2' AND tb_connection.ID_adj='3') mas isto não funciona Link para o comentário Compartilhar em outros sites More sharing options...
0 raphael_suporte Postado Julho 1, 2009 Denunciar Share Postado Julho 1, 2009 tenta assim:SELECT name FROM tb_user, tb_connection WHERE tb_connection.ID_user = tb_user.ID AND tb_connection.ID_adj in ('2','3')o campo ID está como Char ou int?? se tiver como Int, não precisa da aspa simples. Link para o comentário Compartilhar em outros sites More sharing options...
0 Denis Courcy Postado Julho 1, 2009 Denunciar Share Postado Julho 1, 2009 Oi, 'Fabiano R'Eu quero selecionar pessoas que são sexy e rich minha Query; SELECT name FROM tb_user, tb_connection WHERE tb_connection.ID_user = tb_user.ID AND (tb_connection.ID_adj='2' AND tb_connection.ID_adj='3') É quase isto. Tente assim:SELECT STRAIGHT_JOIN u.name FROM tb_user u INNER JOIN tb_connection t ON t.ID_user = u.ID INNER JOIN tb_adj a ON a.ID = t.ID_adj WHERE a.name IN ('sexy', 'rich'); Link para o comentário Compartilhar em outros sites More sharing options...
0 Fabiano R Postado Julho 1, 2009 Autor Denunciar Share Postado Julho 1, 2009 tenta assim:SELECT name FROM tb_user, tb_connection WHERE tb_connection.ID_user = tb_user.ID AND tb_connection.ID_adj in ('2','3')o campo ID está como Char ou int?? se tiver como Int, não precisa da aspa simples.Obrigado pelo retorno raphaeldesta maneira eu já tentei. ele retorna ou um ou outro,preciso que ele retorne exatamente, por exemplo preciso que retorne as pessoas que estão na tabela que são sexy E ricas Link para o comentário Compartilhar em outros sites More sharing options...
0 raphael_suporte Postado Julho 1, 2009 Denunciar Share Postado Julho 1, 2009 Oi, 'Fabiano R'Eu quero selecionar pessoas que são sexy e rich minha Query; SELECT name FROM tb_user, tb_connection WHERE tb_connection.ID_user = tb_user.ID AND (tb_connection.ID_adj='2' AND tb_connection.ID_adj='3') É quase isto. Tente assim:SELECT STRAIGHT_JOIN u.name FROM tb_user u INNER JOIN tb_connection t ON t.ID_user = u.ID INNER JOIN tb_adj a ON a.ID = t.ID_adj WHERE a.name IN ('sexy', 'rich');já tentou da Forma como o Denis falou? Link para o comentário Compartilhar em outros sites More sharing options...
0 Fabiano R Postado Julho 1, 2009 Autor Denunciar Share Postado Julho 1, 2009 Oi, 'Fabiano R'Eu quero selecionar pessoas que são sexy e rich minha Query; SELECT name FROM tb_user, tb_connection WHERE tb_connection.ID_user = tb_user.ID AND (tb_connection.ID_adj='2' AND tb_connection.ID_adj='3') É quase isto. Tente assim:SELECT STRAIGHT_JOIN u.name FROM tb_user u INNER JOIN tb_connection t ON t.ID_user = u.ID INNER JOIN tb_adj a ON a.ID = t.ID_adj WHERE a.name IN ('sexy', 'rich');Obrigado Denis, obrigado pelo retorno;será que existe a possíbilidade de fazer algo com o IN apenas usando a WHERE Digo que isso por essa query faz parte de um filtro, e estou incrementando esses filtros depois do WHERE, o IN quase serviu, mas preciso que ele retorne os usuários que fazem partes dos dois grupos, não apenas de um deles. Link para o comentário Compartilhar em outros sites More sharing options...
0 neto.joaobatista Postado Julho 1, 2009 Denunciar Share Postado Julho 1, 2009 Digo que isso por essa query faz parte de um filtro, e estou incrementando esses filtros depois do WHERE, o IN quase serviu, mas preciso que ele retorne os usuários que fazem partes dos dois grupos, não apenas de um deles.Então a query tem que retornar apenas a Mary, é isso ??Se for tenta ai:SELECT u.name, c.ID_user, c.ID_adj "adj1", c2.ID_adj "adj2" FROM tb_connection c JOIN tb_connection c2 ON ( c2.ID_adj = 2 ) AND ( c.ID_adj = 3 ) AND ( c2.ID_user = c.ID_user ) LEFT JOIN tb_user u ON u.ID = c.ID_user[]'sJ. Neto Link para o comentário Compartilhar em outros sites More sharing options...
0 Denis Courcy Postado Julho 1, 2009 Denunciar Share Postado Julho 1, 2009 Digo que isso por essa query faz parte de um filtro, e estou incrementando esses filtros depois do WHERE, o IN quase serviu, mas preciso que ele retorne os usuários que fazem partes dos dois grupos, não apenas de um deles.Para trazer ambos os grupos Tenta assim:SELECT STRAIGHT_JOIN u.name FROM tb_user u INNER JOIN tb_connection t ON t.ID_user = u.ID INNER JOIN tb_adj a ON a.ID = t.ID_adj WHERE a.name ='sexy' AND u.ID IN ( SELECT STRAIGHT_JOIN t2.ID_user FROM tb_connection t2 INNER JOIN tb_adj a2 ON a2.ID = t2.ID_adj WHERE a2.name = 'rich'); Link para o comentário Compartilhar em outros sites More sharing options...
0 neto.joaobatista Postado Julho 1, 2009 Denunciar Share Postado Julho 1, 2009 (editado) Para trazer ambos os grupos Tenta assim:SELECT STRAIGHT_JOIN u.name FROM tb_user u INNER JOIN tb_connection t ON t.ID_user = u.ID INNER JOIN tb_adj a ON a.ID = t.ID_adj WHERE a.name ='sexy' AND u.ID IN ( SELECT STRAIGHT_JOIN t2.ID_user FROM tb_connection t2 INNER JOIN tb_adj a2 ON a2.ID = t2.ID_adj WHERE a2.name = 'rich'); Só comparando: mysql> explain SELECT STRAIGHT_JOIN u.name FROM tb_user u INNER JOIN tb_connection t ON t.ID_user = u.ID INNER JOIN tb_adj a ON a.ID = t.ID_adj WHERE a.name ='sexy' AND u.ID IN ( SELECT STRAIGHT_JOIN t2.ID_user FROM tb_connection t2 INNER JOIN tb_adj a2 ON a2.ID = t2.ID_adj WHERE a2.name = 'rich'); +----+--------------------+-------+--------+---------------+---------+---------+---------------+------+--------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+--------------------+-------+--------+---------------+---------+---------+---------------+------+--------------------------------+ | 1 | PRIMARY | u | ALL | PRIMARY | NULL | NULL | NULL | 4 | Using where | | 1 | PRIMARY | t | ALL | NULL | NULL | NULL | NULL | 6 | Using where; Using join buffer | | 1 | PRIMARY | a | eq_ref | PRIMARY | PRIMARY | 3 | test.t.ID_adj | 1 | Using where | | 2 | DEPENDENT SUBQUERY | t2 | ALL | NULL | NULL | NULL | NULL | 6 | Using where | | 2 | DEPENDENT SUBQUERY | a2 | ALL | PRIMARY | NULL | NULL | NULL | 5 | Using where; Using join buffer | +----+--------------------+-------+--------+---------------+---------+---------+---------------+------+--------------------------------+ 5 rows in set (0.00 sec) mysql> explain SELECT u.name, c.ID_user, c.ID_adj "adj1", c2.ID_adj "adj2" FROM tb_connection c JOIN tb_connection c2 ON ( c2.ID_adj = 2 ) AND ( c.ID_adj = 3 ) AND ( c2.ID_user = c.ID_user ) LEFT JOIN tb_user u ON u.ID = c.ID_user; +----+-------------+-------+--------+---------------+---------+---------+----------------+------+--------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+--------+---------------+---------+---------+----------------+------+--------------------------------+ | 1 | SIMPLE | c | ALL | NULL | NULL | NULL | NULL | 6 | Using where | | 1 | SIMPLE | u | eq_ref | PRIMARY | PRIMARY | 3 | test.c.ID_user | 1 | | | 1 | SIMPLE | c2 | ALL | NULL | NULL | NULL | NULL | 6 | Using where; Using join buffer | +----+-------------+-------+--------+---------------+---------+---------+----------------+------+--------------------------------+ 3 rows in set (0.00 sec)[]'sJ. Neto Editado Julho 1, 2009 por neto.joaobatista Link para o comentário Compartilhar em outros sites More sharing options...
0 Denis Courcy Postado Julho 1, 2009 Denunciar Share Postado Julho 1, 2009 Oi, 'neto.joaobatista'!Seu modelo (apesar de mais enxuto) o programador deve saber com que código foi cadasrado um nick.Por outro lado, procurei mostrar como buscar um nick sem importar por qual código ele foi cadastrado. De qualquer forma, parabéns pela iniciativa. Link para o comentário Compartilhar em outros sites More sharing options...
0 neto.joaobatista Postado Julho 1, 2009 Denunciar Share Postado Julho 1, 2009 Oi, 'neto.joaobatista'!Seu modelo (apesar de mais enxuto) o programador deve saber com que código foi cadasrado um nick.Por outro lado, procurei mostrar como buscar um nick sem importar por qual código ele foi cadastrado. De qualquer forma, parabéns pela iniciativa.Sim, claro...O ponto de utilizar o ID e não a string é exatamente para ganharmos em velocidade. Existem casos em que a comparação entre strings é de fato necessária, mas não acho que esse seja o caso.A tabela de usuários sempre crescerá verticalmente, assim como a tabela de relacionamentos (tb_connection) mas a tabela de adjetivos chegará em um ponto em que ela parará de crescer e sou capaz de apostar que ela jamais chegará a mais de uma dezena. Com a tabela de adjetivos sempre pequena podemos ter uma caixa de combinação com os adjetivos referenciando aos ids da tabela de adjetivos.A questão pode não ser importante quando falamos em algumas centenas de registros, mas se o número chega em algumas centenas de milhares ou até milhões, então a comparação entre strings pode ser um problema.[]'sJ. Neto Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Fabiano R
Bom dia,
Irei explicar meu problema;
minhas tablas:
tb_user
+-----+----+
| ID | name |
+-----+----+
| 1 | Mary |
| 2 | Nick |
| 3 | Jhon |
| 4 | Brad |
+-----+----+
tb_adj
+---------+--------+
| ID | name |
+---------+--------+
| 1 | nice |
| 2 | rich |
| 3 | sexy |
| 4 | ugly |
| 5 | fat |
+---------+--------+
tb_connection
+-----+----+
| ID | ID_user | ID_adj |
+-----+----+
| 1 | 1 | 1 |
| 2 | 1 | 3 |
| 3 | 4 | 3 |
| 4 | 2 | 5 |
| 5 | 2 | 5 |
| 6 | 1 | 2 |
+-----+----+
Eu quero selecionar pessoas que são sexy e rich
minha Query;
SELECT name FROM tb_user, tb_connection
WHERE tb_connection.ID_user = tb_user.ID
AND (tb_connection.ID_adj='2' AND tb_connection.ID_adj='3')
mas isto não funciona
Link para o comentário
Compartilhar em outros sites
10 respostass a esta questão
Posts Recomendados