Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde, estou desenvolvendo um sistema web e preciso exibir uma tabela com determinados dados. O problema, é que preciso montar um inner join fazendo a busca por data (até ai OK) entretanto preciso da fazer a soma dos dados da coluna "quantidade" e exibir na tabela abaixo. Não tenho ideia de como fazer essa busca, tentei de várias formas porém não deu certo, quando coloquei BETWEEN deu erro...
<?php or = "localhost";
$usuario = "root";
$senha = "";
$dbname = "controlebaldeio";
//Criar a conexao
$conn = mysqli_connect($servidor, $usuario, $senha, $dbname);
if(!$conn){
die("Falha na conexao: " . mysqli_connect_error());
}else{
//echo "Conexao realizada com sucesso";
} ?>
<center><form method="post" action="">
<label>Data incial:</label>
<input id="dataInicial" name="dataInicial" type="date" required="" >
<label>Data final:</label>
<input id="dataFinal" name="dataFinal" type="date" required="" >
<button id="enviar" name="enviar" class="btn btn-primary">Enviar </button>
</form></center>
<table class="table table-hover">
<thead>
<tr>
<th><CENTER>#</CENTER></th>
<th><CENTER>CM</CENTER></th>
<th><CENTER>DATA VIAGEM</CENTER></th>
<th><CENTER>QUANTIDADE</CENTER></th>
<th><CENTER>LOCAL</CENTER></th>
</tr>
</thead>
<?php
$dataInicial = $_POST['dataInicial'];
$dataFinal = $_POST['dataFinal'];
$result_usuario = "select * from registro inner join cm where cm_idcm = idcm and local = 'Puma - Klabin - Ortigueira' ORDER BY registro.dataViagem";
$resultado_usuario = mysqli_query($conn, $result_usuario);
while($row_usuarios = mysqli_fetch_assoc($resultado_usuario)){
$cm_idcm = $row_usuarios['cm_idcm'];
$prefixo = $row_usuarios['prefixo'];
$dataViagem = $row_usuarios['dataViagem'];
$quantidade = $row_usuarios['quantidade'];
$local = $row_usuarios['local'];
echo "<tr>";
echo "<td><CENTER> $cm_idcm</CENTER></td>";
echo "<td><CENTER> $prefixo</CENTER></td>";
echo "<td><CENTER> $dataViagem</CENTER></td>";
echo "<td><CENTER> $quantidade</CENTER></td>";
echo "<td><CENTER> $local</CENTER></td>";
echo "</tr>";
}
?>>
7 minutos atrás, Gabriel Heming disse:
Nesse caso, é melhor exibir a estrutura da tabela (DDL) para que possamos entender aonde está cada campo e como poderá proceder com o SQL.
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Database: controlebaldeio
--
-- --------------------------------------------------------
--
-- Estrutura da tabela registro
--
CREATE TABLE `registro` (
`idregistro` int(11) NOT NULL,
`login_idlogin` int(11) NOT NULL,
`cm_idcm` int(11) NOT NULL,
`dataViagem` date DEFAULT NULL,
`quantidade` varchar(10) NOT NULL,
`local` varchar(60) NOT NULL,
`hora` time NOT NULL,
`dataAtual` date DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Extraindo dados da tabela registro
--
INSERT INTO registro (idregistro, login_idlogin, cm_idcm, dataViagem, quantidade, local, hora, dataAtual) VALUES
(54, 6, 17, '2017-09-09', '2', 'Puma - Klabin - Ortigueira', '05:48:00', '2017-09-09'),
(53, 6, 17, '2017-09-09', '3', 'MA - Klabin - Telêmaco Borba', '05:48:00', '2017-09-09'),
--
-- Indexes for dumped tables
--
--
-- Indexes for table registro
--
ALTER TABLE `registro`
ADD PRIMARY KEY (`idregistro`),
ADD KEY `registro_FKIndex1` (`login_idlogin`),
ADD KEY `registro_FKIndex2` (`cm_idcm`),
ADD KEY `IFK_Rel_01` (`login_idlogin`),
ADD KEY `IFK_Rel_02` (`cm_idcm`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table registro
--
ALTER TABLE `registro`
MODIFY `idregistro` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=55;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
Tabela acima é a "registros"
essa abaixo é a tabela "CM"
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Database: controlebaldeio
--
-- --------------------------------------------------------
--
-- Estrutura da tabela cm
--
CREATE TABLE `cm` (
`idcm` int(11) NOT NULL,
`prefixo` varchar(10) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Extraindo dados da tabela cm
--
INSERT INTO cm (idcm, prefixo) VALUES
(20, 'cm56'),
(19, 'CM14'),
(18, 'CM13'),
(17, 'CM12'),
(16, 'CM11'),
(15, 'CM10');
--
-- Indexes for dumped tables
--
--
-- Indexes for table cm
--
ALTER TABLE `cm`
ADD PRIMARY KEY (`idcm`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table cm
--
ALTER TABLE `cm`
MODIFY `idcm` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=21;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;Na sua consulta, voê não está fazendo a busca por data, conforme menciona no enunciado.
Para a soma, é simples. Utilize a função SUM e adicionane ao group by as colunas que você deseja exibir que não usam funções de agregação:
SELECT
local,
hora,
sum(quantidade) as quantidade,
FROM
registros
INNER JOIN cm ON (registros.cm_idcm = cm.idcm)
GROUP BY
local,
hora
Entretanto, a DDL não condiz exatamente com o seu enunciado.
Muito obrigado pela resposta, próximo passo é incluir um between
Basicamente você pode restringir com o WHERE antes do agrupamento... (WHERE SEMPRE ANTES DO GROUP BY):
Ex:
SELECT
local,
hora,
sum(quantidade) as quantidade,
FROM
registros
INNER JOIN cm ON (registros.cm_idcm = cm.idcm)
WHERE dataAtual BETWEEN '2017-09-13' AND '2017-09-13'
GROUP BY
local,
hora
Entenda mais:
https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html
Muuuito obrigado companheiro, funcionou da forma desejada
Nesse caso, é melhor exibir a estrutura da tabela (DDL) para que possamos entender aonde está cada campo e como poderá proceder com o SQL.