Получение нескольких строк одной и той же вещи из базы данных

0

У меня возникли проблемы с этой базой данных mysql, которую я получил из школы. Я получаю повторяющиеся строки с тем же именем, но разные количества. Я бы предположил, что это потому, что "инвентарь" содержит столбцы с тем же именем, что и в "наборах". Но я действительно не могу заставить его работать. Заранее благодарю вас за вашу помощь.

Схема базы данных (на шведском языке, но названия на английском языке.): Http://weber.itn.liu.se/~stegu76/TNMK30-2016/legodatabasen.pdf

Изображение 174551 Я очень новичок в этом, поэтому любые советы будут оценены.

$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;
Теги:
database

1 ответ

2

Проблема в том, что инвентарь, детали и цвета не соединены с наборами.

Это нормально делать соединения в предложении 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.

  • 0
    Именно так! Когда вы выполняете JOIN без условия ON или FROM a,b без WHERE a.something=b.something SQL генерирует все возможные комбинации строк из a и b. Это проявляется в вашем наборе результатов в виде беспорядка дублирующихся строк, которые не имеют особого смысла.
  • 0
    Спасибо! Это сработало. (проверено через школьный веб-сайт проверки). Но теперь у меня есть проблема с моей печатью. Ничего не распечатывает. Все так же, как в моем сообщении OG за исключением того, что я удалил год. я сделал это: объединить наборы на складе. SetID = sets.SetID Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню