Olá, estou passando por um problema e gostaria de pedir ajuda de vocês. É o seguinte:
Estou integrando um sistema PHP ao plugin Woocommerce do Wordpress e necessito requisitar alguns produtos do banco de dados, até ai tudo bem. O problema se incia ao buscar o produto na tabela. Ela está assim
Order id / meta_key / value
1 2 3
2 2 87
3 3 45
Eu preciso selecionar o id 1 que contem o valor 3 desde que o id 2 contenha o valor 87. Como faço isso? Estou completamente perdido
Olá pessoal, não sei se é possível mas minha ideia seria usar o operador IN dentro de um JOIN
substituindo o "=". Ex: Teria uma tabela itens_cardapio (car_id, car_nome, car_bebidas)
e outra tabela > bebidas (b_id, b_nome)
Sei que poderia relaciona n:m tendo uma tabela tipo itens_cardapio_has_bebidas (fk_car_id, fk_b_id) porém queria fazer diferente pois para o que quero isso geraria muitas linhas na tabela de junção.
Gostaria que o campo car_bebidas na 1ª tabela armazenasse os ids das bebidas da 2ª tabela. Ex. car_bebidas=1,2,5,6,9,11
e na consulta ficaria algo do tipo:
SELECT i.* , GROUP_CONCAT(b.b_nome) FROM itens_cardapio i INNER JOIN bebidas b ON (b.b_id IN i.car_bebidas)
Tentei também algo tipo
SELECT i.* , (SELECT b.nome FROM bebidas b WHERE b.b_id IN i.car_bebidas) FROM itens_cardapio i
Usei algumas variação com GROUP BY e GROUP_CONCAT,...
Consegui obter resultados como:
- a primeira bebida de cada item do cardápio
- repetir várias vezes cada bebida por item,
e outros, mas nenhum 100% correto.
Se no IN usar os números dos ids das bebidas manualmente, ao invés de puxar de um campo, ele busca as bebidas pedidas, porém não fica dinâmico, pois é sempre os mesmos números de modo a todos itens do cardápio ficaram com (coca-cola,sprite,fanta) por exemplo.
Se tiverem alguma ideia agradeço.
Boa tarde,
Estou literalmetne levando um banho aqui, preciso enviar 3 parametros para uma procedure e retornar 2, estou fazendo da seguinte forma:
$exec = $Conn->prepare("SET @p_total := ?");
$exec->bind_param('i',$total);
$exec->execute();
$exec = $Conn->prepare("SET @p_vlrvenda := ?");
$exec->bind_param('d',$vlrvenda);
$exec->execute();
$exec = $Conn->query("CALL addSacola($codcliente,$codproduto,$codconsultora)");
$exec = $Conn->query("SELECT @p_total,@p_vlrvenda");
$row = $exec->fetch_row();
O problema é o retorno que está vindo NULL ja conferi a procedure e o select está retornando o valor correto.
Tenho as seguintes tabelas:
CREATE TABLE horariofuncionario (
codigo_horariofuncionario INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
codigo_statushorariofuncionario INTEGER UNSIGNED NOT NULL,
codigo_funcionario INTEGER UNSIGNED NOT NULL,
horario_horariofuncionario VARCHAR(5) NOT NULL,
data_horariofuncionario VARCHAR(10) NOT NULL,
nomeDiaSemana_horariofuncionario VARCHAR(15) NOT NULL,
PRIMARY KEY(codigo_horariofuncionario),
FOREIGN KEY(codigo_funcionario)
REFERENCES funcionario(codigo_funcionario)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
FOREIGN KEY(codigo_statushorariofuncionario)
REFERENCES statushorariofuncionario(codigo_statushorariofuncionario)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
CREATE TABLE statushorariofuncionario (
codigo_statushorariofuncionario INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
nome_statushorariofuncionario VARCHAR(30) NOT NULL,
PRIMARY KEY(codigo_statushorariofuncionario)
);
CREATE TABLE servicosalao (
codigo_servicosalao INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
codigo_salao INT NOT NULL,
codigo_servico INTEGER UNSIGNED NOT NULL,
preco_servicosalao VARCHAR(20) NULL,
tempo_servicosalao INTEGER UNSIGNED NULL,
descricao_servicosalao VARCHAR(200) NULL,
PRIMARY KEY(codigo_servicosalao),
FOREIGN KEY(codigo_salao)
REFERENCES salao(codigo_salao)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
FOREIGN KEY(codigo_servico)
REFERENCES servico(codigo_servico)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
Preciso selecionar os HORARIOFUNCIONARIO.horario_horariofuncionario em que o HORARIOFUNCIONARIO.codigo_statushorariofuncionario seja 1 ou 3 e que não contenha nenhum registro na tabela horariofuncionario em que o HORARIOFUNCIONARIO.horario_horariofuncionario esteja entre o HORARIOFUNCIONARIO.horario_horariofuncionario e o HORARIOFUNCIONARIO.horario_horariofuncionario + SERVICOSALAO.tempo_servicosalao e o HORARIOFUNCIONARIO.codigo_statushorariofuncionario seja igual a 2.
Então tenho a query:
SELECT hf.horario_horariofuncionario
FROM horariofuncionario hf
WHERE hf.codigo_statushorariofuncionario IN (1,3)
HAVING (SELECT COUNT(hf.codigo_horariofuncionario)
FROM horariofuncionario hf
NATURAL JOIN servicosalao ss
WHERE hf.codigo_statushorariofuncionario = 2
AND STR_TO_DATE(hf.horario_horariofuncionario,'%H:%i')
BETWEEN STR_TO_DATE(hf.horario_horariofuncionario,'%H:%i') AND
SEC_TO_TIME( SUM( TIME_TO_SEC( STR_TO_DATE(hf.horario_horariofuncionario,'%H:%i') )
+ TIME_TO_SEC( STR_TO_DATE(ss.tempo_servicosalao,'%H:%i') ) ) ) ) < 1;
Está retornando o erro: Invalid use of group function ErrorNr 1111
Tenho o seguinte SELECT no qual preciso selecionar somente os horario_horariofuncionario que estejam em um determinado período de tempo (para isso uso a função BETWEEN) e com o codigo_statushorariofuncionario 1 ou 3, (para isso uso a função IN).
O sub select não pode retornar nenhum resultado, por isso ao final do sub select adicionei = 0.
SELECT hf.horario_horariofuncionario
FROM horariofuncionario hf
WHERE hf.codigo_statushorariofuncionario IN (1,3)
AND (SELECT COUNT(hf.codigo_statushorariofuncionario)
FROM horariofuncionario hf
NATURAL JOIN servicosalao ss
WHERE STR_TO_DATE(hf.horario_horariofuncionario,'%H:%i')
BETWEEN (STR_TO_DATE(hf.horario_horariofuncionario,'%H:%i') AND
SEC_TO_TIME( SUM( TIME_TO_SEC( STR_TO_DATE(hf.horario_horariofuncionario,'%H:%i') )
+ TIME_TO_SEC( STR_TO_DATE(ss.tempo_servicosalao,'%i') ) ) ) )
AND hf.codigo_statushorariofuncionario = 2) = 0;
Contudo essa query está retornando o erro: Invalid use of group function ErrorNr: 1111