Ir para conteúdo

POWERED BY:

Arquivado

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

Good

Stack em inventário de um jogo mysql

Recommended Posts

Como alguns de vocês já jogaram algum MMO, quando você compra Life, Mana, etc.. Sempre vem um pacote com x unidades (chama-se stack).

 

Tenho um jogo aqui, aí há categorias de armas, consumíveis, etc. Os consumíveis só há 3 itens, como life, mana e coins.

 

A query pra fazer o stack, fica assim:

 

SELECT *, COUNT(inventario.iid) AS total FROM inventario,itens WHERE inventario.user_id = '1' AND inventario.item_id = itens.id AND inventario.tipo = 'Box' GROUP BY inventario.item_id LIMIT 0, 8

 

Esta query seleciona todos os itens do usuário, e já faz o stack. Por exemplo:

Box 1 (23 total)

Box 3 (14 total)

 

Ao invés de ficar assim:

Box 1, Box 1, Box 1, Box 1, ..., Box 1

Box 3, Box 3, ..., Box 3, Box 3

 

 

 

Acho que já entenderam o que eu quis dizer.. ^^

 

Agora, a minha dúvida é a seguinte. Na categoria Consumíveis, por exemplo, há os 3 itens que eu falei.

Tipo, o item_id do item Life é 55 e a item_id do item Mana é 61, e item_id de Coins é 74.

 

Eu preciso fazer o stack somente com o Life e o Mana.

 

A minha lógica seria fazer assim: GROUP BY inventario.item_id NOT IN(74)

Ou seja, este comando não exibiria em stack o item de id 74. Acho que deu pra entender ^^

 

 

- Stack significa compactar tudo em um só lugar, ao invés de exibir diversas vezes a mesma coisa;

 

Obrigado gente.. espero uma resposta.. :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que

 



SELECT inventario.item_id, COUNT(inventario.iid) AS total 
FROM inventario,itens 
WHERE inventario.user_id = '1' 
AND inventario.item_id = itens.id 
AND inventario.tipo = 'Box' 
GROUP BY inventario.item_id LIMIT 0, 8

 

 




			
		

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que você não entendeu.. :S

você simplesmente substituiu * por inventario.item_id

 

 

 

O que eu quero é compactar um id específico (inventario.item_id), tipo.

Como mostra a imagem:

 

semttuloval.png

 

Como você pode ver, eu coloquei pra não compactar a ID 74.. O resto eu coloquei tudo para compactar, como posso especificar isso? :s

 

vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se entendi mesmo ...

 

Mas ...

 

SELECT inventario.item_id, COUNT(inventario.iid) AS total 
FROM inventario,itens 
WHERE inventario.user_id = '1' 
AND inventario.item_id = itens.id 
AND inventario.tipo = 'Box' 
AND inventario.item_id <> 74
GROUP BY inventario.item_id LIMIT 0, 8

Resolve ?

 

================================================

 

Como as imagens são montadas ? Vem do BD ?

 

Quais são as colunas da Tabela ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, esta query fez excluir a id 74 da listagem.. :S

 

Como você pode ver na imagem.. o item de ID 82, 66, 48 e 11 ficaram em modo GROUP BY (ou seja, todos os itens com as ids ditas ficaram agrupadas, juntas..). Eu quero fazer com que na mesma query, eu possa colocar pra fazer com que a id 74 não entre no modo GROUP BY.

 

 

As imagens são montadas aleatoriamente, como mostra a ilustração que fiz..As colunas da tabela nem são tão importantes, porque o resto é tudo informações sobre os itens... tipo o nome, descrição, etc..

 

vlw

 

 

############################################################

 

Pesquisei sobre GROUP BY, e vi que pode colocar um HAVING.

 

Fica assim a query:

 

 

 

 

SELECT *, COUNT(inventario.iid) AS total FROM inventario,itens WHERE inventario.user_id = '1' AND inventario.item_id = itens.id AND inventario.tipo = 'Box' GROUP BY inventario.item_id HAVING inventario.item_id IN (82,66,48,11) LIMIT 0, 8

 

 

 

Fazendo o HAVING, só entrará no modo GROUP BY os itens de 82,66,48 e 11. Mas, o item de ID 74 não apareceu na listagem.. :S É como se eu tivesse excluindo ele, mas acho que isso não deveria acontecer.. :s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é excluir nenhum registro, o que quero é não deixar o id 74 entrar no GROUP BY.

 

GROUP BY serve para AGRUPAR resultados!! Igualmente é mostrado naquela imagem que postei. Ele agrupo todas as IDs, exceto a id 74. Preciso fazer com que não agrupe uma determinada ID.

 

................ na primeira query que postei ele agrupa todos os itens. Preciso fazer com que não agrupe a id 74.

Compartilhar este post


Link para o post
Compartilhar em outros sites


inventario.id <> 74 ?!


SELECT inventario.item_id, COUNT(inventario.iid) AS total

FROM inventario,itens

WHERE inventario.user_id = '1'

AND inventario.item_id = itens.id

AND inventario.tipo = 'Box'

AND inventario.id <> 74

GROUP BY inventario.item_id LIMIT 0, 8

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, como eu tinha dito este AND inventario.id <> 74 não influenciou em nada desta vez.. :S

Visto que o GROUP BY apenas agrupou todos os itens do inventário.

 

O que eu quero é isso, resumidamente:

 

Preciso fazer igualmente como é mostrado naquela imagem que postei. Ele agrupou todas as IDs, exceto a id 74. Preciso fazer com que não agrupe uma determinada ID.

Prestando atenção na imagem, verá que agrupou todas as IDs, exceto a 74. Por exemplo, a ID 82 deveria ter listado 12 vezes o mesmo item. Mas não, pois foi agrupado e constantemente usei um COUNT para contar quantas vezes aquele registro deixou de ser repetido, ou seja, o total de itens que há no inventário.

 

 

Motta, se não entendeu por favor fale como você está entendendo pra eu tentar explicar de outra maneira, pois já não sei como explicar mais.

 

 

semttuloval.png

 

 

alguém ajuda..

 

Ninguém sabe? ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio não estar entendo qual dos "ids" é preciso excluir ?

inventario.item_id ? 
inventario.id ?

para que qualquer coisa não retorne numa query só existe uma solução, colocar uma condição de

exclusão (<> not in etc) na condição where.

 

-------------------------------------------------

Ajudei ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, eu não quero excluir nenhum registro. O que eu quero é AGRUPAR RESULTADOS e fazer com quê determinadas IDs não sejam AGRUPADAS.. Se fosse pra excluir eu usava NOT IN, !=, <>,... Assim como você disse.

 

 

Há duas tabelas para este sistema:

-> item { os campos são: id, nome, descricao, forca, agilidade, etc }

inventario.item_id = significa a id do item da tabela do sistema. Onde há as informações sobre o nome, descrição, etc do item.

 

 

-> inventario { os campos são: id, item_id, user_id, tipo, etc}

inventario.id = significa a id do item do usuário; (essa id é só para especificar a id do item que está no inventário, tem mesma função de uma id de usuário. Por exemplo, a id deste tópico é 489368.)

 

 

Bom, vamos lá novamente. Na imagem que eu postei:

-> as IDs que entram no GROUP BY são 82, 66, 48 e 11.

-> A ID que não entra no GROUP BY é 74.

 

GROUP BY serve para agrupar resultados, correto?

 

 

Alguém que esteja lendo este tópico também. Deu pra entender? :s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Excluir no caso é retirar do resultado da consulta (não apagar ou deletar).

Agora, por :

fazer com quê determinadas IDs não sejam AGRUPADAS.


deve entender não "ler" os registros destes id 《A》

ou

"ler" mas ao exibir não agrupá-los ??
ou seja 82, 66, 48 e 11 sairiam agrupados e
74 sairia mas não agrupado , sairia detalhado 《B》

---------------------------------------------
Sendo A basta realmente incluir no
where
algo como

and id <> 74


sendo B creio ser impossível.

Compartilhar este post


Link para o post
Compartilhar em outros sites

é.. excluir é retirar do resultado..

 

Este aqui:

 

 

"ler" mas ao exibir não agrupá-los ??

ou seja 82, 66, 48 e 11 sairiam agrupados e

74 sairia mas não agrupado

 

Preciso fazer desta maneira.. :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça uma query com o agrupamento para quem é diferente de 74 e outra sem agrupar para o 74.

 

Como são coisas distintas precisa de ter duas formas de saída na exibição.

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.