У меня возникли проблемы с этой базой данных mysql, которую я получил из школы. Я получаю повторяющиеся строки с тем же именем, но разные количества. Я бы предположил, что это потому, что "инвентарь" содержит столбцы с тем же именем, что и в "наборах". Но я действительно не могу заставить его работать. Заранее благодарю вас за вашу помощь.
Схема базы данных (на шведском языке, но названия на английском языке.): Http://weber.itn.liu.se/~stegu76/TNMK30-2016/legodatabasen.pdf
Я очень новичок в этом, поэтому любые советы будут оценены.
$setidquery = "SELECT inventory.Quantity, inventory.ItemID, inventory.ColorID, colors.Colorname, parts.Partname, sets.SetID, sets.Year, inventory.ItemtypeID FROM 'inventory', 'parts', 'colors', 'sets' WHERE sets.SetID='$_COOKIE[setid]' AND inventory.ItemID=parts.PartID AND inventory.ColorID=colors.ColorID ORDER BY Partname ASC LIMIT 1000";
echo "<table class=\"table\">";
echo "<tr><th>Quantity:</th><th>Year:</th><th>Partname:</th><th>ItemID:</th><th>SetID</th><th>Image:</th></tr>";
while($row = mysqli_fetch_array($result)){
$prefix = "http://www.itn.liu.se/~stegu76/img.bricklink.com/";
$Year = $row['Year'];
$Quantity = $row['Quantity'];
$ItemID = $row['ItemID'];
$ColorID = $row['ColorID'];
$Partname = $row['Partname'];
$SetID = $row['SetID'];
$ItemtypeID = $row['ItemtypeID'];
$imagesearch = mysqli_query($conn, "SELECT * FROM 'images' WHERE ItemTypeID = '$ItemtypeID' AND ItemID = '$ItemID' AND ColorID = '$ColorID' ");
$imageinfo = mysqli_fetch_array($imagesearch);
if($imageinfo['has_jpg']) {
$filename = "$ItemtypeID/$ColorID/$ItemID.jpg";
} else if($imageinfo['has_gif']) {
$filename = "$ItemtypeID/$ColorID/$ItemID.gif";
} else {
$filename = "noimage_small.png";
}
echo "<tr>
<td>$Year</td>
<td>$Quantity</td>
<td>$Partname</td>
<td>$ItemID</td>
<td>$SetID</td>
<td><img src=\"$prefix$filename\" alt=\"Part $ItemID\"/></td>
</tr>";
}
echo "</table>";
Вот запрос, отформатированный для удобства чтения:
SELECT inventory.Quantity,
inventory.ItemID,
inventory.ColorID,
colors.Colorname,
parts.Partname,
sets.SetID, sets.Year,
inventory.ItemtypeID
FROM 'inventory', 'parts', 'colors', 'sets'
WHERE sets.SetID='$_COOKIE[setid]'
AND inventory.ItemID=parts.PartID
AND inventory.ColorID=colors.ColorID
ORDER BY Partname ASC LIMIT 1000;
Проблема в том, что инвентарь, детали и цвета не соединены с наборами.
Это нормально делать соединения в предложении where, но, как говорит Strawberry, мы предпочитаем писать соединения в предложении from now. Я думаю, что это облегчает их чтение, что помогает выявлять недостающие объединения.
Вот ваш оператор выбора (отформатированный, чтобы помочь мне увидеть, что происходит):
select
inventory.quantity,
inventory.itemid,
inventory.colorid,
colors.colorname,
parts.partname,
sets.setid,
sets.year,
inventory.itemtypeid
from
inventory,
parts,
colors,
sets
where
sets.setid='$_cookie[setid]' and
inventory.itemid = parts.partid and
inventory.colorid = colors.colorid
order by
partname asc
limit 1000;
И вот версия присоединения. Я показал отсутствующее соединение с "?" где вам нужно что-то добавить:
select
inventory.quantity,
inventory.itemid,
inventory.colorid,
colors.colorname,
parts.partname,
sets.setid,
sets.year,
inventory.itemtypeid
from
inventory
join
parts
on inventory.itemid = parts.partid
join
colors,
on inventory.colorid = colors.colorid
join
sets
on set.? = ?.?
where
sets.setid='$_cookie[setid]'
order by
partname asc
limit 1000;
Важно то, что наборы не объединяются. Я бы предположил, что есть три набора (для каждого из показанных примеров в любом случае). Поскольку вы не сказали, как присоединиться к заданию, запрос возвращает остальные строки один раз для каждого набора, другими словами, он присоединяется к каждому набору, потому что вы никоим образом не ограничили соединение.
Если вы хотите узнать больше о SQL, есть много вариантов. Мой сайт - www.thedatastudio.net.
JOIN
без условияON
илиFROM a,b
безWHERE a.something=b.something
SQL генерирует все возможные комбинации строк из a и b. Это проявляется в вашем наборе результатов в виде беспорядка дублирующихся строк, которые не имеют особого смысла.