Ir para conteúdo
Fórum Script Brasil
  • 0

Selecionar mais de um campo


Fabiano R

Pergunta

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

  • 0

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

  • 0
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 raphael

desta 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

  • 0
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

  • 0
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

  • 0
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

[]'s

J. Neto

Link para o comentário
Compartilhar em outros sites

  • 0
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

  • 0
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)

[]'s

J. Neto

Editado por neto.joaobatista
Link para o comentário
Compartilhar em outros sites

  • 0

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

  • 0
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.

[]'s

J. Neto

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...